<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>Desarrollo, programación y tecnología.</title>
	<atom:link href="http://danielggarcia.wordpress.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://danielggarcia.wordpress.com</link>
	<description>Espacio personal de Daniel García</description>
	<lastBuildDate>Mon, 07 Mar 2011 18:14:16 +0000</lastBuildDate>
	<language>es</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
<cloud domain='danielggarcia.wordpress.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://0.gravatar.com/blavatar/2244176902fda4a21613eb1cfc2d2cc8?s=96&#038;d=http%3A%2F%2Fs2.wp.com%2Fi%2Fbuttonw-com.png</url>
		<title>Desarrollo, programación y tecnología.</title>
		<link>http://danielggarcia.wordpress.com</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://danielggarcia.wordpress.com/osd.xml" title="Desarrollo, programación y tecnología." />
	<atom:link rel='hub' href='http://danielggarcia.wordpress.com/?pushpress=hub'/>
		<item>
		<title>Mudanza</title>
		<link>http://danielggarcia.wordpress.com/2009/05/28/mudanza/</link>
		<comments>http://danielggarcia.wordpress.com/2009/05/28/mudanza/#comments</comments>
		<pubDate>Thu, 28 May 2009 10:40:49 +0000</pubDate>
		<dc:creator>Daniel García</dc:creator>
				<category><![CDATA[Personal]]></category>

		<guid isPermaLink="false">http://danielggarcia.wordpress.com/2009/05/28/mudanza/</guid>
		<description><![CDATA[Nos vemos en http://danigarcia.org Posted in Personal<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=danielggarcia.wordpress.com&amp;blog=7628136&amp;post=223&amp;subd=danielggarcia&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Nos vemos en <a title="http://danigarcia.org" href="http://danigarcia.org" target="_self">http://danigarcia.org</a> <img src='http://s0.wp.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<br />Posted in Personal  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/danielggarcia.wordpress.com/223/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/danielggarcia.wordpress.com/223/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/danielggarcia.wordpress.com/223/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/danielggarcia.wordpress.com/223/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/danielggarcia.wordpress.com/223/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/danielggarcia.wordpress.com/223/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/danielggarcia.wordpress.com/223/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/danielggarcia.wordpress.com/223/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/danielggarcia.wordpress.com/223/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/danielggarcia.wordpress.com/223/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/danielggarcia.wordpress.com/223/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/danielggarcia.wordpress.com/223/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/danielggarcia.wordpress.com/223/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/danielggarcia.wordpress.com/223/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=danielggarcia.wordpress.com&amp;blog=7628136&amp;post=223&amp;subd=danielggarcia&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://danielggarcia.wordpress.com/2009/05/28/mudanza/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/0e19fd20a30938297df19f63e79e0578?s=96&#38;d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96&#38;r=G" medium="image">
			<media:title type="html">danielggarcia</media:title>
		</media:content>
	</item>
		<item>
		<title>Tratamiento de cadenas en SQL Server</title>
		<link>http://danielggarcia.wordpress.com/2009/05/28/tratamiento-de-cadenas-en-sql-server/</link>
		<comments>http://danielggarcia.wordpress.com/2009/05/28/tratamiento-de-cadenas-en-sql-server/#comments</comments>
		<pubDate>Thu, 28 May 2009 05:52:11 +0000</pubDate>
		<dc:creator>Daniel García</dc:creator>
				<category><![CDATA[Nivel intermedio]]></category>
		<category><![CDATA[SQL Server]]></category>
		<category><![CDATA[sql]]></category>
		<category><![CDATA[T-SQL]]></category>

		<guid isPermaLink="false">http://danielggarcia.wordpress.com/?p=207</guid>
		<description><![CDATA[En cualquier lenguaje de programación es tarea obligada poseer una manipulación de cadenas fluida. Transact SQL proporciona una variedad bastante amplia de funciones para llevar a cabo tal tarea. Algunas de las operaciones que podemos realizar son concatenación, obtención de subcadenas, pasar a mayúsculas o minúsculas, eliminar espacios en blanco&#8230; incluso detectar la similitud entre [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=danielggarcia.wordpress.com&amp;blog=7628136&amp;post=207&amp;subd=danielggarcia&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>En cualquier lenguaje de programación es tarea obligada poseer una manipulación de cadenas fluida.</p>
<p>Transact SQL proporciona una variedad bastante amplia de funciones para llevar a cabo tal tarea. Algunas de las operaciones que podemos realizar son concatenación, obtención de subcadenas, pasar a mayúsculas o minúsculas, eliminar espacios en blanco&#8230; incluso detectar la similitud entre expresiones.</p>
<p>A continuación veremos algunas de ellos y aplicaremos algunos ejemplos:</p>
<p><span id="more-207"></span></p>
<p><strong>LOWER y UPPER</strong></p>
<p>Devuelven un VARCHAR o un NVARCHAR con la expresión pasada como parámetro en minúsculas y en mayúsculas, respectivamente.</p>
<p><pre class="brush: sql;">
SELECT LOWER(Nombre) AS Minusculas FROM Usuario
SELECT UPPER(Nombre) AS Mayusculas FROM Usuario
</pre></p>
<p><img class="aligncenter size-full wp-image-208" title="090501LowerUpper" src="http://danielggarcia.files.wordpress.com/2009/05/090501lowerupper.png?w=720" alt="090501LowerUpper"   /></p>
<p><strong>LEN</strong></p>
<p>Devuelve la longitud en caracteres de una cadena.</p>
<p><pre class="brush: sql;">

SELECT LEN(Nombre) AS NumCaracteres, Nombre FROM Usuario

</pre></p>
<p><img class="aligncenter size-full wp-image-209" title="090502Len" src="http://danielggarcia.files.wordpress.com/2009/05/090502len.png?w=720" alt="090502Len"   /><strong>SUBSTRING</strong></p>
<p>Recupera una subcadena de la expresión dada, indicando la posición inicial (empezando por la posición 0) y el número de caracteres a &#8220;leer&#8221;.<br />
Es útil en combinación con LEN para mostrar secciones de texto. Por ejemplo, para eliminar los dos últimos caracteres de un nombre, escribiríamos lo que sigue:</p>
<p><pre class="brush: sql;">
SELECT SUBSTRING(Nombre, 0, LEN(Nombre)-2) AS SubCadena FROM Usuario
</pre></p>
<p><img class="aligncenter size-full wp-image-210" title="090503Substring" src="http://danielggarcia.files.wordpress.com/2009/05/090503substring.png?w=720" alt="090503Substring"   /><br />
<strong>LEFT y RIGHT</strong></p>
<p>Parecido a SUBSTRING. LEFT devuelve los N primeros caracteres de la cadena dada, mientras que RIGHT devolverá los N últimos.</p>
<p><pre class="brush: sql;">
SELECT LEFT(Nombre, LEN(Nombre)-2) AS [Left] FROM Usuario
SELECT RIGHT(Nombre, LEN(Nombre)-2) AS [Right] FROM Usuario
</pre></p>
<p><img class="aligncenter size-full wp-image-211" title="090504LeftRight" src="http://danielggarcia.files.wordpress.com/2009/05/090504leftright.png?w=720" alt="090504LeftRight"   /><strong>LTRIM y RTRIM </strong></p>
<p>Eliminan todos los espacios de la izquierda y de la derecha, respectivamente, de la expresión dada.</p>
<p><pre class="brush: sql;">
-- Elimina los espacios a la izquierda
SELECT LTRIM('     PRUEBA       ') AS [LTRIM];

-- Elimina los espacios a la derecha
SELECT RTRIM('     PRUEBA       ') AS [RTRIM];

-- Elimina los espacios a la derecha y a la izquierda
SELECT(LTRIM(RTRIM('     PRUEBA       '))) AS [LTRIM + RTRIM];

</pre></p>
<p><img class="aligncenter size-full wp-image-212" title="090505Trim" src="http://danielggarcia.files.wordpress.com/2009/05/090505trim.png?w=720" alt="090505Trim"   /><br />
<strong>DIFFERENCE</strong></p>
<p>Establece un rango de similitud entre dos expresiones, que varía entre 0 (ninguna similitud) y 4 (mucha similitud).</p>
<p><pre class="brush: sql;">
-- Mucha similitud, rango 4
SELECT DIFFERENCE('García', 'Gracia') AS Rango

-- Cierta similitud, rango 2
SELECT DIFFERENCE('López', 'Pérez') AS Rango

-- Ninguna similitud, rango 0
SELECT DIFFERENCE('New York City', 'Barcelona') AS Rango

</pre></p>
<p><img class="aligncenter size-full wp-image-213" title="090506Difference" src="http://danielggarcia.files.wordpress.com/2009/05/090506difference.png?w=720" alt="090506Difference"   /><br />
<strong>REVERSE</strong></p>
<p>Invierte una cadena.</p>
<p><pre class="brush: sql;">
SELECT REVERSE(Nombre) AS erbmoN FROM Usuario
</pre></p>
<p><img class="aligncenter size-full wp-image-214" title="090507Reverse" src="http://danielggarcia.files.wordpress.com/2009/05/090507reverse.png?w=720" alt="090507Reverse"   /><br />
<strong>CHARINDEX</strong></p>
<p>Busca la primera expresión en la segunda y devuelve la posición en la que se encuentra su primera aparición, comenzando desde la posición 0.</p>
<p><pre class="brush: sql;">
SELECT CHARINDEX('prueba', 'Esto es una prueba prueba') AS [CharIndex]
</pre></p>
<p><img class="aligncenter size-full wp-image-215" title="090508CharIndex" src="http://danielggarcia.files.wordpress.com/2009/05/090508charindex.png?w=720" alt="090508CharIndex"   /><br />
<strong>PATINDEX</strong></p>
<p>Busca el patrón indicado en la primera expresión en la segunda y devuelve la posición en la que se encuentra su primera aparición, comenzando desde la posición 0. La diferencia con CHARINDEX es la posibilidad de utilizar patrones en lugar de expresiones.</p>
<p><pre class="brush: sql;">
SELECT Nombre, 'ua' AS Patron, PATINDEX('%ua%', Nombre) AS Posicion FROM Usuario
</pre></p>
<p><img class="aligncenter size-full wp-image-216" title="090509PatIndex" src="http://danielggarcia.files.wordpress.com/2009/05/090509patindex.png?w=720" alt="090509PatIndex"   /><strong>REPLICATE</strong></p>
<p>Repite la expresión dada como primer argumento un número de veces igual al indicado por el segundo argumento.</p>
<p><pre class="brush: sql;">
SELECT REPLICATE(Nombre + ' ', 2) AS Replica FROM Usuario
</pre></p>
<p><img class="aligncenter size-full wp-image-217" title="090510Replicate" src="http://danielggarcia.files.wordpress.com/2009/05/090510replicate.png?w=720" alt="090510Replicate"   /></p>
<p>Para una información más detallada, no obstante, aconsejo acudir a la <a title="MSDN" href="http://msdn.microsoft.com/en-us/library/ms181984.aspx" target="_blank">MSDN</a>.</p>
<br />Posted in Nivel intermedio, SQL Server  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/danielggarcia.wordpress.com/207/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/danielggarcia.wordpress.com/207/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/danielggarcia.wordpress.com/207/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/danielggarcia.wordpress.com/207/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/danielggarcia.wordpress.com/207/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/danielggarcia.wordpress.com/207/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/danielggarcia.wordpress.com/207/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/danielggarcia.wordpress.com/207/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/danielggarcia.wordpress.com/207/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/danielggarcia.wordpress.com/207/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/danielggarcia.wordpress.com/207/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/danielggarcia.wordpress.com/207/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/danielggarcia.wordpress.com/207/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/danielggarcia.wordpress.com/207/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=danielggarcia.wordpress.com&amp;blog=7628136&amp;post=207&amp;subd=danielggarcia&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://danielggarcia.wordpress.com/2009/05/28/tratamiento-de-cadenas-en-sql-server/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/0e19fd20a30938297df19f63e79e0578?s=96&#38;d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96&#38;r=G" medium="image">
			<media:title type="html">danielggarcia</media:title>
		</media:content>

		<media:content url="http://danielggarcia.files.wordpress.com/2009/05/090501lowerupper.png" medium="image">
			<media:title type="html">090501LowerUpper</media:title>
		</media:content>

		<media:content url="http://danielggarcia.files.wordpress.com/2009/05/090502len.png" medium="image">
			<media:title type="html">090502Len</media:title>
		</media:content>

		<media:content url="http://danielggarcia.files.wordpress.com/2009/05/090503substring.png" medium="image">
			<media:title type="html">090503Substring</media:title>
		</media:content>

		<media:content url="http://danielggarcia.files.wordpress.com/2009/05/090504leftright.png" medium="image">
			<media:title type="html">090504LeftRight</media:title>
		</media:content>

		<media:content url="http://danielggarcia.files.wordpress.com/2009/05/090505trim.png" medium="image">
			<media:title type="html">090505Trim</media:title>
		</media:content>

		<media:content url="http://danielggarcia.files.wordpress.com/2009/05/090506difference.png" medium="image">
			<media:title type="html">090506Difference</media:title>
		</media:content>

		<media:content url="http://danielggarcia.files.wordpress.com/2009/05/090507reverse.png" medium="image">
			<media:title type="html">090507Reverse</media:title>
		</media:content>

		<media:content url="http://danielggarcia.files.wordpress.com/2009/05/090508charindex.png" medium="image">
			<media:title type="html">090508CharIndex</media:title>
		</media:content>

		<media:content url="http://danielggarcia.files.wordpress.com/2009/05/090509patindex.png" medium="image">
			<media:title type="html">090509PatIndex</media:title>
		</media:content>

		<media:content url="http://danielggarcia.files.wordpress.com/2009/05/090510replicate.png" medium="image">
			<media:title type="html">090510Replicate</media:title>
		</media:content>
	</item>
		<item>
		<title>Introducción a Reflection (III): Ejecutando métodos de un objeto a partir de su tipo</title>
		<link>http://danielggarcia.wordpress.com/2009/05/27/introduccion-a-reflection-iii-ejecutando-metodos-de-un-objeto-a-partir-de-su-tipo/</link>
		<comments>http://danielggarcia.wordpress.com/2009/05/27/introduccion-a-reflection-iii-ejecutando-metodos-de-un-objeto-a-partir-de-su-tipo/#comments</comments>
		<pubDate>Wed, 27 May 2009 05:43:11 +0000</pubDate>
		<dc:creator>Daniel García</dc:creator>
				<category><![CDATA[C#]]></category>
		<category><![CDATA[Nivel avanzado]]></category>
		<category><![CDATA[reflection]]></category>

		<guid isPermaLink="false">http://danielggarcia.wordpress.com/?p=201</guid>
		<description><![CDATA[Ayer veíamos cómo obtener información de un objeto mediante el espacio de nombres Reflection. Ahora veremos que no solo es posible obtener información de los metadatos, sino que también es posible acceder a sus miembros. Vimos previamente que nuestra clase  ClasePrueba tenía una función llamada sumarUno(). Vamos a intentar, mediante Reflection, invocar a la función [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=danielggarcia.wordpress.com&amp;blog=7628136&amp;post=201&amp;subd=danielggarcia&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Ayer veíamos cómo obtener información de un objeto mediante el espacio de nombres Reflection. Ahora veremos que no solo es posible obtener información de los metadatos, sino que también es posible acceder a sus miembros.</p>
<p>Vimos previamente que nuestra clase  <em>ClasePrueba</em> tenía una función llamada <em>sumarUno()</em>. Vamos a intentar, mediante <em>Reflection</em>, invocar a la función sin necesidad de &#8220;conocer&#8221; el objeto. En realidad, y para simplificar el ejemplo, utilizaremos el nombre del método directamente, pero sería posible, a partir de una estructura MethodInfo, obtener nombre y parámetros de cada uno de los métodos y ejecutarlos de forma dinámica.</p>
<p>Partiendo del código del artículo anterior, añadiríamos lo siguiente para invocar el método:</p>
<p><pre class="brush: csharp;">
 // Ejecutamos un método mediante Reflection. En primer lugar obtenemos una referencia al método
 MethodInfo Metodo = tipoObjeto.GetMethod(&quot;sumarUno&quot;);

 // A continuación, llamamos al método Invoke del tipo, pasándole como primer parámetro
 //el objeto cuyo método queremos ejecutar, y como segundo parámetro, un array de objetos con
 //los parámetros que espera el método o función.
 int dato;
 object[] parametros = new object[1] { 2 };
 dato = (int)Metodo.Invoke(objeto, parametros);

 Console.WriteLine(&quot;El resultado de la invocación ha sido: &quot; + dato.ToString());

</pre></p>
<p>Recordemos que el objeto &#8216;<em>objeto</em>&#8216; era una instancia de <em>ClasePrueba</em>.</p>
<p>Como puntilla mostraremos otra forma de invocar un método mediante Reflection: utilizando <a title="Activator" href="http://msdn.microsoft.com/es-es/library/system.activator.aspx" target="_blank">Activator</a> para obtener una instancia de la clase <em>ClasePrueba</em> y ejecutando el método <a title="Type.InvokeMember" href="http://msdn.microsoft.com/es-es/library/de3dhzwy.aspx" target="_blank">Type.InvokeMember()</a>.</p>
<p><pre class="brush: csharp;">

 // Utilizamos la clase Activator para ejecutar el método de otro objeto
 object objeto2 = Activator.CreateInstance(tipoObjeto);
 dato = (int)tipoObjeto.InvokeMember(&quot;sumarUno&quot;, BindingFlags.InvokeMethod, null, objeto2, parametros);

 Console.WriteLine(&quot;El resultado de la invocación (mediante Activator) ha sido: &quot; + dato.ToString());
</pre></p>
<p>El resultado sería el siguiente:</p>
<p><img class="aligncenter size-full wp-image-202" title="090502Resul" src="http://danielggarcia.files.wordpress.com/2009/05/090502resul.png?w=720" alt="090502Resul"   /></p>
<br />Posted in C#, Nivel avanzado  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/danielggarcia.wordpress.com/201/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/danielggarcia.wordpress.com/201/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/danielggarcia.wordpress.com/201/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/danielggarcia.wordpress.com/201/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/danielggarcia.wordpress.com/201/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/danielggarcia.wordpress.com/201/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/danielggarcia.wordpress.com/201/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/danielggarcia.wordpress.com/201/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/danielggarcia.wordpress.com/201/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/danielggarcia.wordpress.com/201/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/danielggarcia.wordpress.com/201/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/danielggarcia.wordpress.com/201/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/danielggarcia.wordpress.com/201/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/danielggarcia.wordpress.com/201/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=danielggarcia.wordpress.com&amp;blog=7628136&amp;post=201&amp;subd=danielggarcia&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://danielggarcia.wordpress.com/2009/05/27/introduccion-a-reflection-iii-ejecutando-metodos-de-un-objeto-a-partir-de-su-tipo/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/0e19fd20a30938297df19f63e79e0578?s=96&#38;d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96&#38;r=G" medium="image">
			<media:title type="html">danielggarcia</media:title>
		</media:content>

		<media:content url="http://danielggarcia.files.wordpress.com/2009/05/090502resul.png" medium="image">
			<media:title type="html">090502Resul</media:title>
		</media:content>
	</item>
		<item>
		<title>Introducción a Reflection (II): Obteniendo metadatos de una clase</title>
		<link>http://danielggarcia.wordpress.com/2009/05/26/introduccion-a-reflection-ii-obteniendo-metadatos-de-una-clase/</link>
		<comments>http://danielggarcia.wordpress.com/2009/05/26/introduccion-a-reflection-ii-obteniendo-metadatos-de-una-clase/#comments</comments>
		<pubDate>Tue, 26 May 2009 05:33:59 +0000</pubDate>
		<dc:creator>Daniel García</dc:creator>
				<category><![CDATA[C#]]></category>
		<category><![CDATA[Nivel avanzado]]></category>
		<category><![CDATA[reflection]]></category>

		<guid isPermaLink="false">http://danielggarcia.wordpress.com/?p=197</guid>
		<description><![CDATA[En artículos anteriores hemos visto la potencia de las clases contenidas en el espacio de nombres Reflection. Hoy vamos a intentar profundizar un poco más en la potencia que podemos obtener utilizando estos recursos. Como hemos visto, Reflection proporciona clases que permiten leer los metadatos de una clase. Bien&#8230; habrá quien se pregunte&#8230; ¿qué es [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=danielggarcia.wordpress.com&amp;blog=7628136&amp;post=197&amp;subd=danielggarcia&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>En artículos anteriores hemos visto la potencia de las clases contenidas en el espacio de nombres <a title="System.Reflection" href="http://msdn.microsoft.com/es-es/library/system.reflection(VS.80).aspx" target="_blank">Reflection</a>. Hoy vamos a intentar profundizar un poco más en la potencia que podemos obtener utilizando estos recursos.<br />
Como hemos visto, <em>Reflection</em> proporciona clases que permiten leer los metadatos de una clase. Bien&#8230; habrá quien se pregunte&#8230; ¿qué es un <a title="Metadato [Wikipedia.org]" href="http://es.wikipedia.org/wiki/Metadato" target="_blank">metadato</a>? Un metadato no es más que un dato que describe a otro dato. Por ejemplo, en el ámbito que vamos a ver a continuación, el nombre de la clase es en sí un metadato. De hecho, la propia clase en sí es un metadato, ya que describe un &#8220;patrón&#8221; o estructura de los objetos que derivan de ella.<br />
<em>Reflection</em> nos proporciona una serie de clases que se encargan de encapsular ensamblados, módulos y tipos. Esto nos permite realizar acciones como conocer el nombre de una clase o invocar un método de un objeto -a priori- desconocido en tiempo real.</p>
<p><span id="more-197"></span>A modo didáctico, veremos las posibilidades de exploración e invocación de reflection. Para comenzar, crearemos una clase con dos atributos, dos propiedades, dos métodos y cuatro constructores, a la que llamaremos <em>ClasePrueba</em>:</p>
<p><pre class="brush: csharp;">
using System;
using System.Collections.Generic;
using System.Text;

namespace Simple.Test
{
 /// &lt;summary&gt;
 /// Clase de prueba, cuyo objetivo es demostrar la utilización del espacio de nombres Reflection
 /// &lt;/summary&gt;
 /// &lt;changelog&gt;
 /// Daniel Garcia (contacto at danigarcia punto o erre ge)
 /// 26/05/2009    Creacion
 /// &lt;/changelog&gt;
 public class ClasePrueba
 {
    #region Atributos y Propiedades

    private int variableEntera;
    private string variableCadena;

    public int PropiedadEntero
    {
       get { return variableEntera;}
       set { variableEntera = value;}
    }

    public string PropiedadCadena
    {
       get { return variableCadena; }
       set { variableCadena = value; }
    }

 #endregion

 #region Constructores

    public ClasePrueba()
    {
       variableCadena = &quot;&quot;;
       variableEntera = 0;
    }

    public ClasePrueba(int entero)
    {
       variableCadena = &quot;&quot;;
       variableEntera = entero;
    }

    public ClasePrueba(string cadena)
    {
       variableCadena = cadena;
       variableEntera = 0;
    }

   public ClasePrueba(int entero, string cadena)
    {
       variableCadena = cadena;
       variableEntera = entero;
    }

 #endregion

 #region Funciones

    public int sumarUno(int dato)
    {
       PropiedadEntero = dato + 1;
       return PropiedadEntero;
    }

    public string insertarLetra(char caracter)
    {
       PropiedadCadena += caracter;
       return PropiedadCadena;
    }

 #endregion

    }
}

</pre></p>
<p>Creada nuestra clase, es hora de comenzar a &#8220;reflexionar&#8221; sobre el tema. Como punto de inicio, instanciaremos un objeto de la clase <em>ClasePrueba</em> y declararemos una referencia <a title="Type" href="http://msdn.microsoft.com/es-es/library/system.type(VS.80).aspx" target="_blank">Type</a> a la asignaremos el tipo de nuestro objeto, mediante la función <a title="GetType" href="http://msdn.microsoft.com/es-es/library/system.type.gettype.aspx" target="_blank">GetType()</a>.</p>
<p><pre class="brush: csharp;">
 // Instanciamos el objeto
 ClasePrueba objeto = new ClasePrueba();

 // Obtenemos su tipo
 Type tipoObjeto = objeto.GetType();</pre></p>
<p>A continuación, &#8220;exprimimos&#8221; el contenido de nuestro tipo, obteniendo información variada como métodos, constructores, propiedades o miembros en general.<pre class="brush: csharp;">
 // Obtenemos información sobre miembros, constructores y métodos
 ConstructorInfo[] Constructores = tipoObjeto.GetConstructors();
 MemberInfo[] Miembros = tipoObjeto.GetMembers();
 PropertyInfo[] Propiedades = tipoObjeto.GetProperties();
 MethodInfo[] Metodos = tipoObjeto.GetMethods();
</pre></p>
<p>Finalmente, mostrar la información por pantalla será tarea sencilla recorriendo los arrays con distintas informaciones.</p>
<p><pre class="brush: csharp;">
 Console.WriteLine(&quot;Constructores:&quot;);
 Console.WriteLine(&quot;-------------------------------------------------------------&quot;);
 foreach (ConstructorInfo info in Constructores)
     Console.WriteLine(info.ToString());

 Console.WriteLine(&quot;Miembros:&quot;);
 Console.WriteLine(&quot;-------------------------------------------------------------&quot;);
 foreach (MemberInfo info in Miembros)
     Console.WriteLine(info.ToString());

 Console.WriteLine(&quot;Propiedades:&quot;);
 Console.WriteLine(&quot;-------------------------------------------------------------&quot;);
 foreach (PropertyInfo info in Propiedades)
     Console.WriteLine(info.ToString());

 Console.WriteLine(&quot;Metodos:&quot;);
 Console.WriteLine(&quot;-------------------------------------------------------------&quot;);
 foreach (MethodInfo info in Metodos)
     Console.WriteLine(info.ToString());

</pre></p>
<p>El resultado es fascinante: toda la información sobre la clase al alcance de un click.</p>
<p><img class="aligncenter size-full wp-image-198" title="090501Reflection" src="http://danielggarcia.files.wordpress.com/2009/05/090501reflection.png?w=720" alt="090501Reflection"   /><br />
Posteriormente comprobaremos otra tarea sencilla con Reflection: invocar métodos de un objeto.</p>
<br />Posted in C#, Nivel avanzado  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/danielggarcia.wordpress.com/197/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/danielggarcia.wordpress.com/197/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/danielggarcia.wordpress.com/197/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/danielggarcia.wordpress.com/197/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/danielggarcia.wordpress.com/197/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/danielggarcia.wordpress.com/197/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/danielggarcia.wordpress.com/197/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/danielggarcia.wordpress.com/197/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/danielggarcia.wordpress.com/197/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/danielggarcia.wordpress.com/197/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/danielggarcia.wordpress.com/197/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/danielggarcia.wordpress.com/197/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/danielggarcia.wordpress.com/197/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/danielggarcia.wordpress.com/197/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=danielggarcia.wordpress.com&amp;blog=7628136&amp;post=197&amp;subd=danielggarcia&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://danielggarcia.wordpress.com/2009/05/26/introduccion-a-reflection-ii-obteniendo-metadatos-de-una-clase/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/0e19fd20a30938297df19f63e79e0578?s=96&#38;d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96&#38;r=G" medium="image">
			<media:title type="html">danielggarcia</media:title>
		</media:content>

		<media:content url="http://danielggarcia.files.wordpress.com/2009/05/090501reflection.png" medium="image">
			<media:title type="html">090501Reflection</media:title>
		</media:content>
	</item>
		<item>
		<title>Eliminar la hora a una fecha en SQL Server 2005</title>
		<link>http://danielggarcia.wordpress.com/2009/05/25/eliminar-la-hora-a-una-fecha-en-sql-server-2005/</link>
		<comments>http://danielggarcia.wordpress.com/2009/05/25/eliminar-la-hora-a-una-fecha-en-sql-server-2005/#comments</comments>
		<pubDate>Mon, 25 May 2009 05:37:57 +0000</pubDate>
		<dc:creator>Daniel García</dc:creator>
				<category><![CDATA[Nivel básico]]></category>
		<category><![CDATA[SQL Server]]></category>
		<category><![CDATA[Conversiones]]></category>
		<category><![CDATA[Fechas]]></category>
		<category><![CDATA[sql]]></category>
		<category><![CDATA[T-SQL]]></category>

		<guid isPermaLink="false">http://danielggarcia.wordpress.com/?p=193</guid>
		<description><![CDATA[Hay veces que pese a recibir un parámetro en formato fecha que almacene dia y hora, nos interese únicamente almacenar (o recuperar) la parte correspondiente a la fecha. Aquellos que hayan realizado alguna vez comparaciones de fechas situadas en un intervalo probablemente sepan de qué hablo: ¿Comparar entre un día a las 00:00:00 y el [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=danielggarcia.wordpress.com&amp;blog=7628136&amp;post=193&amp;subd=danielggarcia&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Hay veces que pese a recibir un parámetro en formato fecha que almacene dia y hora, nos interese únicamente almacenar (o recuperar) la parte correspondiente a la fecha.<br />
Aquellos que hayan realizado alguna vez comparaciones de fechas situadas en un intervalo probablemente sepan de qué hablo: ¿Comparar entre un día a las 00:00:00 y el siguiente a las 00:00:00? ¿Entre el mismo día entre las 00:00:00 y las 23:59:59?</p>
<p>Una forma simple de ahorrarnos dolores de cabeza sería almacenar la fecha sin hora. Para ello haremos uso de los <a title="CAST y CONVERT" href="http://msdn.microsoft.com/es-es/library/ms187928.aspx" target="_blank">distintos formatos de fecha</a> que nos permite promocionar SQL Server y escribiríamos algo así:</p>
<p><pre class="brush: sql;"> UPDATE NombreTabla SET CampoFecha = convert(datetime, convert(varchar(10), CampoFecha, 103))  </pre></p>
<p>Con lo cual, almacenaremos nuestra fecha en formato DD:MM:AAAA 00:00:00.</p>
<br />Posted in Nivel básico, SQL Server  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/danielggarcia.wordpress.com/193/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/danielggarcia.wordpress.com/193/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/danielggarcia.wordpress.com/193/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/danielggarcia.wordpress.com/193/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/danielggarcia.wordpress.com/193/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/danielggarcia.wordpress.com/193/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/danielggarcia.wordpress.com/193/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/danielggarcia.wordpress.com/193/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/danielggarcia.wordpress.com/193/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/danielggarcia.wordpress.com/193/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/danielggarcia.wordpress.com/193/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/danielggarcia.wordpress.com/193/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/danielggarcia.wordpress.com/193/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/danielggarcia.wordpress.com/193/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=danielggarcia.wordpress.com&amp;blog=7628136&amp;post=193&amp;subd=danielggarcia&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://danielggarcia.wordpress.com/2009/05/25/eliminar-la-hora-a-una-fecha-en-sql-server-2005/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/0e19fd20a30938297df19f63e79e0578?s=96&#38;d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96&#38;r=G" medium="image">
			<media:title type="html">danielggarcia</media:title>
		</media:content>
	</item>
		<item>
		<title>Implementación de interfaces en C#</title>
		<link>http://danielggarcia.wordpress.com/2009/05/23/implementacion-de-interfaces-en-c/</link>
		<comments>http://danielggarcia.wordpress.com/2009/05/23/implementacion-de-interfaces-en-c/#comments</comments>
		<pubDate>Sat, 23 May 2009 05:37:20 +0000</pubDate>
		<dc:creator>Daniel García</dc:creator>
				<category><![CDATA[C#]]></category>
		<category><![CDATA[Nivel básico]]></category>
		<category><![CDATA[.NET]]></category>
		<category><![CDATA[interfaces]]></category>

		<guid isPermaLink="false">http://danielggarcia.wordpress.com/?p=185</guid>
		<description><![CDATA[Una técnica imprescindible para lograr un adecuado nivel de abstracción es la utilización de interfaces. Hablando en llano, una interfaz no es más que una estructura de datos que muestra únicamente las firmas de los métodos de una clase. A partir de ahí, una clase que herede de la interfaz estará obligada a &#8220;rellenar&#8221; la [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=danielggarcia.wordpress.com&amp;blog=7628136&amp;post=185&amp;subd=danielggarcia&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Una técnica imprescindible para lograr un adecuado nivel de abstracción es la utilización de interfaces.</p>
<p>Hablando en llano, una interfaz no es más que una estructura de datos que muestra únicamente las firmas de los métodos de una clase. A partir de ahí, una clase que herede de la interfaz estará obligada a &#8220;rellenar&#8221; la implementación de dichos métodos. De forma simple, una interfaz sería algo así:</p>
<p><code>Interfaz Motor<br />
 &nbsp;&nbsp;&nbsp;&nbsp;Arrancar();<br />
 &nbsp;&nbsp;&nbsp;&nbsp;Detener();</code></p>
<p><span id="more-185"></span></p>
<p>Esta interfaz únicamente dice QUÉ acciones se van a realizar, pero no CÓMO se realizarán. Para saber cómo realizarlas, crearemos clases que implementen esta interfaz, obligando a &#8220;rellenar&#8221; el contenido de los métodos que declaramos previamente.</p>
<p>Por poner un ejemplo:</p>
<p><code>Clase Gasolina : Motor<br />
&nbsp;&nbsp;&nbsp;&nbsp;Arrancar()<br />
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;InyectarAire();<br />
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IniciarCarburacion();<br />
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;EncenderMezcla(Bujía);<br />
 &nbsp;&nbsp;&nbsp;&nbsp;Detener()<br />
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DetenerCarburacion();</code></p>
<p><code>Clase Diesel : Motor<br />
 &nbsp;&nbsp;&nbsp;&nbsp;Arrancar()<br />
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;InyectarCombustible();<br />
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;InyectarAire();<br />
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Comprimir();<br />
 &nbsp;&nbsp;&nbsp;&nbsp;Detener()<br />
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DetenerInyeccion();</code></p>
<p>Ahora imaginemos que tenemos una clase &#8220;Coche&#8221; que necesite un &#8220;Motor&#8221;. Esta clase debe ignorar el funcionamiento interno del motor, únicamente debe saber cómo arrancarlo y cómo pararlo.</p>
<p><code>Clase Vehiculo<br />
 &nbsp;&nbsp;&nbsp;&nbsp;Motor m;</code></p>
<p>Para ello hará uso de los métodos <em>Arrancar()</em> y <em>Parar()</em>. Esta interfaz será donde se &#8220;conecte&#8221; el motor, independientemente de si es un Gasolina o un Diesel. Por ello, si quisiéramos utilizar un motor Diesel, haríamos lo siguiente:</p>
<p><code>m = new Diesel();<br />
 &nbsp;&nbsp;&nbsp;&nbsp;m.Arrancar();</code></p>
<p>Como podemos observar, para un motor gasolina sería igual, salvo que declararíamos una instancia de la clase Gasolina.</p>
<p><strong>Implementando una interfaz en C#</strong></p>
<p>Como ejemplo de implementación y utilización de interfaces en C#, crearemos una interfaz ITest que implemente dos métodos: HolaMundo y DevolverCadena. Esta interfaz será implementada por dos clases: Minusculas y Mayusculas. La primera devolverá cadenas en minúsculas, mientras que la segunda, lo hará en mayúsculas.<br />
Para comenzar, crearemos tres clases: <em>ITest</em>, <em>Minusculas</em> y <em>Mayusculas</em>. Estableceremos el cuerpo de ITest de la siguiente forma:</p>
<p><pre class="brush: csharp;">

using System;
using System.Collections.Generic;
using System.Text;

namespace Simple.Interface
{
    public interface ITest
    {
        string HolaMundo();
        string DevolverCadena(string s);
    }
}

</pre></p>
<p>Así de simple. Establecemos los nombres de las funciones junto a sus parámetros (sin establecer niveles de visibilidad, como <em>public</em>, <em>protected</em> o <em>private</em>). Hecho esto, tenemos declarada una interfaz.</p>
<p>El segundo paso será crear nuestras clases que la implementen. Comenzaremos por &#8220;<em>Minusculas</em>&#8220;. Lo único que deberemos hacer será añadir dos puntos tras el nombre de la clase, y a continuación, el nombre de la clase o interfaz de la que hereda, en nuestro caso, <em>ITest</em>.</p>
<p><pre class="brush: csharp;">

using System;
using System.Collections.Generic;
using System.Text;

namespace Simple.Interface
{
    public class Minusculas : ITest
    {

    }
}

</pre></p>
<p>Acto seguido, haremos click derecho sobre &#8220;ITest&#8221; y seleccionaremos la opción &#8220;Implementar interfaz&#8221;.</p>
<p><img class="aligncenter size-full wp-image-187" title="090501ImplementarInterfaz" src="http://danielggarcia.files.wordpress.com/2009/05/090501implementarinterfaz.png?w=720" alt="090501ImplementarInterfaz"   /></p>
<p>Con esto se añadirán automáticamente a nuestro código aquellos elementos que necesiten ser implementados.</p>
<p><pre class="brush: csharp;">

#region Miembros de ITest

public string HolaMundo()
{
    throw new Exception(&quot;The method or operation is not implemented.&quot;);
}

public string DevolverCadena(string s)
{
    throw new Exception(&quot;The method or operation is not implemented.&quot;);
}

#endregion

</pre></p>
<p>Por último, sustituiremos las sentencias throw por nuestro propio código, que será el siguiente:</p>
<p><pre class="brush: csharp;">

#region Miembros de ITest

public string HolaMundo()
{
    return (&quot;hola, mundo&quot;);
}

public string DevolverCadena(string s)
{
    return s.ToLower();
}

#endregion

</pre></p>
<p>Con la clase <em>Mayusculas</em> realizaremos la misma operación, solo que la implementación será la siguiente:</p>
<p><pre class="brush: csharp;">

#region Miembros de ITest

public string HolaMundo()
{
    return (&quot;HOLA, MUNDO&quot;);
}

public string DevolverCadena(string s)
{
    return s.ToUpper();
}

#endregion

</pre></p>
<p>Ahora deberemos probar nuestro código. En un proyecto de aplicación de consola, declararemos una referencia a nuestra interfaz (lo que equivaldría una referencia al Motor en el primer ejemplo).</p>
<p>Hecho esto, le asociamos una instancia de cualquiera de las clases que la implementen:</p>
<p><pre class="brush: csharp;">

ITest minusculas = new Minusculas();
ITest mayusculas = new Mayusculas();

Console.WriteLine(minusculas.HolaMundo());
Console.WriteLine(mayusculas.HolaMundo());

Console.WriteLine(&quot;------------------------------------------------&quot;);

Console.WriteLine(minusculas.DevolverCadena(&quot;Esto es una Prueba de INTERFACES&quot;));
Console.WriteLine(mayusculas.DevolverCadena(&quot;Esto es una Prueba de INTERFACES&quot;));

</pre></p>
<p>Como observaremos a continuación, nuestra interfaz ITest conoce los métodos que tiene, pero no cómo ejecutarlos. Es por ello que, al asociarle una instancia que implemente la interfaz, nuestra referencia se comportará de una forma u otra.</p>
<p><img class="aligncenter size-full wp-image-188" title="090502Ejemplo" src="http://danielggarcia.files.wordpress.com/2009/05/090502ejemplo.png?w=720" alt="090502Ejemplo"   /></p>
<p>Imaginemos la potencia de la utilización de interfaces a la hora de crear, por ejemplo, conexiones a bases de datos. Este será un tema que veremos con posterioridad.</p>
<br />Posted in C#, Nivel básico  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/danielggarcia.wordpress.com/185/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/danielggarcia.wordpress.com/185/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/danielggarcia.wordpress.com/185/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/danielggarcia.wordpress.com/185/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/danielggarcia.wordpress.com/185/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/danielggarcia.wordpress.com/185/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/danielggarcia.wordpress.com/185/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/danielggarcia.wordpress.com/185/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/danielggarcia.wordpress.com/185/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/danielggarcia.wordpress.com/185/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/danielggarcia.wordpress.com/185/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/danielggarcia.wordpress.com/185/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/danielggarcia.wordpress.com/185/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/danielggarcia.wordpress.com/185/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=danielggarcia.wordpress.com&amp;blog=7628136&amp;post=185&amp;subd=danielggarcia&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://danielggarcia.wordpress.com/2009/05/23/implementacion-de-interfaces-en-c/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/0e19fd20a30938297df19f63e79e0578?s=96&#38;d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96&#38;r=G" medium="image">
			<media:title type="html">danielggarcia</media:title>
		</media:content>

		<media:content url="http://danielggarcia.files.wordpress.com/2009/05/090501implementarinterfaz.png" medium="image">
			<media:title type="html">090501ImplementarInterfaz</media:title>
		</media:content>

		<media:content url="http://danielggarcia.files.wordpress.com/2009/05/090502ejemplo.png" medium="image">
			<media:title type="html">090502Ejemplo</media:title>
		</media:content>
	</item>
		<item>
		<title>Añadiendo un TemplateField a un GridView de forma dinámica</title>
		<link>http://danielggarcia.wordpress.com/2009/05/22/anadiendo-un-templatefield-a-un-gridview-de-forma-dinamica/</link>
		<comments>http://danielggarcia.wordpress.com/2009/05/22/anadiendo-un-templatefield-a-un-gridview-de-forma-dinamica/#comments</comments>
		<pubDate>Fri, 22 May 2009 05:12:00 +0000</pubDate>
		<dc:creator>Daniel García</dc:creator>
				<category><![CDATA[ASP.NET]]></category>
		<category><![CDATA[Nivel intermedio]]></category>
		<category><![CDATA[VB.NET]]></category>
		<category><![CDATA[GridView]]></category>
		<category><![CDATA[TemplateField]]></category>
		<category><![CDATA[vb.net]]></category>
		<category><![CDATA[Visual Basic]]></category>

		<guid isPermaLink="false">http://danielggarcia.wordpress.com/?p=177</guid>
		<description><![CDATA[La mayor parte de los sitios web que se sirven de listados lo hacen utilizando un esquema como el que sigue: Como vemos, lo normal suele ser utilizar campos enlazados a la consulta (BoundFields), así como campos-plantilla (TemplateFields) con los que se suele interactuar con el listado (ver detalles, edición, etc.). Si sabemos de antemano [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=danielggarcia.wordpress.com&amp;blog=7628136&amp;post=177&amp;subd=danielggarcia&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>La mayor parte de los sitios web que se sirven de listados lo hacen utilizando un esquema como el que sigue:</p>
<p><img class="aligncenter size-full wp-image-178" title="090501Grid" src="http://danielggarcia.files.wordpress.com/2009/05/090501grid.png?w=720" alt="090501Grid"   /><br />
Como vemos, lo normal suele ser utilizar campos enlazados a la consulta (<em>BoundFields</em>), así como campos-plantilla (<em>TemplateFields</em>) con los que se suele interactuar con el listado (ver detalles, edición, etc.).</p>
<p>Si sabemos de antemano qué datos vamos a obtener, es sencillo &#8220;maquetar&#8221; nuestro GridView de forma sencilla. El problema radica en el momento en el que el número de columnas que nuestro GridView mostrará sea variable. En este caso, el atributo <em>AutoGenerateColumns</em> deberá ser puesto a <em>True</em>, con lo que perderemos el control del orden de los <em>TemplateFields</em>.</p>
<p>Veamos el siguiente caso: queremos un campo plantilla que muestre un <em>LinkButton</em> que nos permita editar el registro, y otro que nos permita visualizar los detalles del mismo. Queremos uno de estos campos en la primera columna (el de edición) y otro en la última (visualización). Si utilizamos TemplateFields con el atributo <em>AutoGenerateColumns=&#8221;True&#8221;</em>, lo que lograremos será que ambos botones se sitúen juntos en las dos primeras columnas de nuestro <em>GridView</em>. ¿Cómo hacer que uno de ellos se coloque al final? Añadiéndolo de forma dinámica.</p>
<p>Para comenzar, añadiremos un <em>GridView</em> con un <em>TemplateField</em> conteniendo un <em>LinkButton</em>, colocando el atributo <em>AutogenerateColumns=&#8221;True&#8221;</em>.</p>
<p><img class="aligncenter size-full wp-image-179" title="090502Grid" src="http://danielggarcia.files.wordpress.com/2009/05/090502grid.png?w=720" alt="090502Grid"   /><br />
El templatefield contendría un LinkButton:</p>
<p><img class="aligncenter size-full wp-image-180" title="090503Grid" src="http://danielggarcia.files.wordpress.com/2009/05/090503grid.png?w=720" alt="090503Grid"   /></p>
<p>El resultado sería este:</p>
<p><img class="aligncenter size-full wp-image-181" title="090504Grid" src="http://danielggarcia.files.wordpress.com/2009/05/090504grid.png?w=720" alt="090504Grid"   /></p>
<p>Seguidamente, acudiremos a nuestro código, listos para editar el evento RowDataBound. En él haremos lo siguiente:</p>
<ul>
<li> Declararemos una celda y un LinkButton.</li>
<li> Daremos formato al LinkButton (nombre, clase, etc.)</li>
<li> Asignaremos al LinkButton un CommandArgument igual al Identificador (DataKey) de esa fila del GridView</li>
<li> Añadiremos el LinkButton a la celda, y la celda a la fila</li>
</ul>
<p>Para ello utilizaremos el siguiente código:</p>
<p><pre class="brush: vb;">

Protected Sub GridView1_RowDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewRowEventArgs) Handles GridView1.RowDataBound
Try

    ' Si se trata de una fila de datos...
    If e.Row.RowType = DataControlRowType.DataRow Then
        Dim celda As New TableCell()
        Dim boton As New LinkButton()

        boton.Text = &quot;Detalles&quot;
        If e.Row.Cells.Count &gt; 1 Then
            boton.CommandArgument = GridView1.DataKeys(e.Row.RowIndex).Value.ToString()
        End If

        ' Añadimos el LinkButton a la celda, y la celda a la fila
        celda.Controls.Add(boton)
        e.Row.Controls.Add(celda)
    End If
Catch ex As Exception
    Throw ex
End Try
End Sub

</pre></p>
<p>Con esto lograremos el buscado esquema [Botón] [CAMPOS] [Botón].</p>
<br />Posted in ASP.NET, Nivel intermedio, VB.NET  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/danielggarcia.wordpress.com/177/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/danielggarcia.wordpress.com/177/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/danielggarcia.wordpress.com/177/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/danielggarcia.wordpress.com/177/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/danielggarcia.wordpress.com/177/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/danielggarcia.wordpress.com/177/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/danielggarcia.wordpress.com/177/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/danielggarcia.wordpress.com/177/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/danielggarcia.wordpress.com/177/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/danielggarcia.wordpress.com/177/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/danielggarcia.wordpress.com/177/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/danielggarcia.wordpress.com/177/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/danielggarcia.wordpress.com/177/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/danielggarcia.wordpress.com/177/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=danielggarcia.wordpress.com&amp;blog=7628136&amp;post=177&amp;subd=danielggarcia&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://danielggarcia.wordpress.com/2009/05/22/anadiendo-un-templatefield-a-un-gridview-de-forma-dinamica/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/0e19fd20a30938297df19f63e79e0578?s=96&#38;d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96&#38;r=G" medium="image">
			<media:title type="html">danielggarcia</media:title>
		</media:content>

		<media:content url="http://danielggarcia.files.wordpress.com/2009/05/090501grid.png" medium="image">
			<media:title type="html">090501Grid</media:title>
		</media:content>

		<media:content url="http://danielggarcia.files.wordpress.com/2009/05/090502grid.png" medium="image">
			<media:title type="html">090502Grid</media:title>
		</media:content>

		<media:content url="http://danielggarcia.files.wordpress.com/2009/05/090503grid.png" medium="image">
			<media:title type="html">090503Grid</media:title>
		</media:content>

		<media:content url="http://danielggarcia.files.wordpress.com/2009/05/090504grid.png" medium="image">
			<media:title type="html">090504Grid</media:title>
		</media:content>
	</item>
		<item>
		<title>Realizando una transacción en SQL Server</title>
		<link>http://danielggarcia.wordpress.com/2009/05/21/realizando-una-transaccion-en-sql-server/</link>
		<comments>http://danielggarcia.wordpress.com/2009/05/21/realizando-una-transaccion-en-sql-server/#comments</comments>
		<pubDate>Thu, 21 May 2009 05:02:13 +0000</pubDate>
		<dc:creator>Daniel García</dc:creator>
				<category><![CDATA[Bases de datos]]></category>
		<category><![CDATA[Nivel intermedio]]></category>
		<category><![CDATA[SQL Server]]></category>
		<category><![CDATA[sql]]></category>
		<category><![CDATA[T-SQL]]></category>
		<category><![CDATA[transacciones]]></category>

		<guid isPermaLink="false">http://danielggarcia.wordpress.com/?p=174</guid>
		<description><![CDATA[Por norma general, me gusta codificar la lógica de acceso a datos en programa, en lugar de en procedimientos almacenados en base de datos. Esta aproximación no es muy óptima (como se suele decir, al César lo que es del César y a Dios lo que es de Dios), ya que el entorno transaccional estará [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=danielggarcia.wordpress.com&amp;blog=7628136&amp;post=174&amp;subd=danielggarcia&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Por norma general, me gusta codificar la lógica de acceso a datos en programa, en lugar de en procedimientos almacenados en base de datos. Esta aproximación no es muy óptima (como se suele decir, <em>al César lo que es del César y a Dios lo que es de Dios</em>), ya que el entorno transaccional estará mejor gestionado por el SGBD que por el código .NET.<br />
Si queremos trasladar la responsabilidad de gestionar la transacción al SGBD, deberemos saber en primer lugar que se declara del siguiente modo:</p>
<p><pre class="brush: sql;">
BEGIN TRAN
 -- Ejecución de sentencias
COMMIT TRAN
</pre></p>
<p>Como imaginaremos, la primera sentencia &#8220;arranca&#8221; la transacción, mientras que la última la compromete. Pero ¿y si ocurre un error en alguna de las sentencias? ¿Cómo lo detectamos?<br />
En el siguiente ejemplo, utilizaremos variables enteras para trazar los fallos y realizar un ROLLBACK en el caso de que la transacción falle.</p>
<p>Se declarará una variable de tipo INT por cada sentencia a ejecutar, y se inician a 0. Se comprueba, después de cada sentencia ejecutada, la variable <em>@@Error</em>, y se almacena en las variables anteriormente creadas. Si es distinta de 0, hay un error, por lo que se añade información al mensaje de error.<br />
Al final de la transacción, si todas las variables son 0, se hace el COMMIT. Si una de ellas es distinta de cero, significará que existe un error y se hace el Rollback, mostrando el mensaje de error.</p>
<p><pre class="brush: sql;">

DECLARE @CadenaError varchar(1000);
 DECLARE @CodigosError varchar(1000);
 DECLARE @ErrorSentencia1 int;
 DECLARE @ErrorSentencia2 int;
 DECLARE @ErrorSentencia3 int;

 SET @ErrorSentencia1 = 0;
 SET @ErrorSentencia2 = 0;
 SET @ErrorSentencia3 = 0;

 SET @CadenaError = 'Error al realizar actualización: ';
 SET @CodigosError = 'Códigos de error: ';

 -- Inicio de la transacción
 BEGIN TRAN

 -- Primera actualización
 UPDATE Usuario SET Nombre = 'Elena' WHERE Nombre = &quot;Helena&quot;;

 -- Almacenamos el posible código de error
 SET @ErrorSentencia1 = @@Error;
 IF (@ErrorSentencia1 &lt;&gt; 0)
 BEGIN
     SET @CadenaError = @CadenaError + 'Actualización 1; '
     SET @CodigosError = @CodigosError + CAST(@ErrorSentencia1 AS VARCHAR(10)) + '; ';
 END

 -- Segunda actualización
 UPDATE Perfil SET Nombre = 'Administrador' WHERE Nombre = &quot;Admin&quot;;

 -- Almacenamos el posible código de error
 SET @ErrorSentencia2 = @@Error;
 IF (@ErrorSentencia2 &lt;&gt; 0)
 BEGIN
     SET @CadenaError = @CadenaError + 'Actualización 2; '
     SET @CodigosError = @CodigosError + CAST(@ErrorSentencia2 AS VARCHAR(10)) + '; ';
 END

 -- Tercera actualización
 UPDATE UsuarioPerfil SET CodigoUsuario = 1 WHERE CodigoPerfil &lt; 3;

 -- Almacenamos el posible código de error
 SET @ErrorSentencia3 = @@Error;
 IF (@ErrorSentencia3 &lt;&gt; 0)
 BEGIN
     SET @CadenaError = @CadenaError + 'Actualización 3; '
     SET @CodigosError = @CodigosError + CAST(@ErrorSentencia3 AS VARCHAR(10)) + '; ';
 END

 -- En ausencia de errores, comprometemos la transacción
 IF (@ErrorSentencia1 = 0) AND (@ErrorSentencia2 = 0) AND (@ErrorSentencia3 = 0)

BEGIN
     COMMIT TRAN;
     PRINT('Transacción realizada con éxito');
 END
 ELSE
 BEGIN
     ROLLBACK TRAN;
     PRINT('Transacción abortada');
     PRINT(@CadenaError);
     PRINT(@CodigosError);
 END

</pre></p>
<p>Con todo esto, obtendremos suficiente información (esperemos) como para detectar donde está el fallo.</p>
<br />Posted in Bases de datos, Nivel intermedio, SQL Server  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/danielggarcia.wordpress.com/174/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/danielggarcia.wordpress.com/174/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/danielggarcia.wordpress.com/174/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/danielggarcia.wordpress.com/174/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/danielggarcia.wordpress.com/174/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/danielggarcia.wordpress.com/174/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/danielggarcia.wordpress.com/174/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/danielggarcia.wordpress.com/174/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/danielggarcia.wordpress.com/174/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/danielggarcia.wordpress.com/174/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/danielggarcia.wordpress.com/174/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/danielggarcia.wordpress.com/174/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/danielggarcia.wordpress.com/174/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/danielggarcia.wordpress.com/174/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=danielggarcia.wordpress.com&amp;blog=7628136&amp;post=174&amp;subd=danielggarcia&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://danielggarcia.wordpress.com/2009/05/21/realizando-una-transaccion-en-sql-server/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/0e19fd20a30938297df19f63e79e0578?s=96&#38;d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96&#38;r=G" medium="image">
			<media:title type="html">danielggarcia</media:title>
		</media:content>
	</item>
		<item>
		<title>Concatenar campos nulos en una consulta SQL</title>
		<link>http://danielggarcia.wordpress.com/2009/05/20/concatenar-campos-nulos-en-una-consulta-sql/</link>
		<comments>http://danielggarcia.wordpress.com/2009/05/20/concatenar-campos-nulos-en-una-consulta-sql/#comments</comments>
		<pubDate>Wed, 20 May 2009 06:34:11 +0000</pubDate>
		<dc:creator>Daniel García</dc:creator>
				<category><![CDATA[Nivel básico]]></category>
		<category><![CDATA[SQL Server]]></category>
		<category><![CDATA[T-SQL]]></category>
		<category><![CDATA[Tricks]]></category>

		<guid isPermaLink="false">http://danielggarcia.wordpress.com/?p=170</guid>
		<description><![CDATA[Hay ocasiones en las que puede que se nos pidan consultas del siguiente tipo: Es decir: concatenar varios campos y devolverlo como uno solo. Ante esto existe un problema bastante común: ¿Qué ocurre cuando uno de estos campos es NULL? Si uno de estos campos es NULL, por defecto el registro devolverá NULL. Esto es, [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=danielggarcia.wordpress.com&amp;blog=7628136&amp;post=170&amp;subd=danielggarcia&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Hay ocasiones en las que puede que se nos pidan consultas del siguiente tipo:</p>
<p><pre class="brush: sql;">
SELECT Nombre + ' ' + Apellido1 + ' ' + Apellido2 AS NombreCompleto FROM Usuario
</pre></p>
<p>Es decir: concatenar varios campos y devolverlo como uno solo. Ante esto existe un problema bastante común: ¿Qué ocurre cuando uno de estos campos es NULL?<br />
Si uno de estos campos es NULL, por defecto el registro devolverá NULL. Esto es, si tenemos un usuario llamado Santiago, cuyo primer apellido es López y su segundo apellido no consta en la base de datos, el resultado de concatenar <em>Santiago + López + NULL</em> será NULL.</p>
<p>Una posible solución a este problema es utilizar condicionales dentro de la propia sentencia T-SQL, haciendo algo así:</p>
<p><pre class="brush: sql;">
SELECT U.IdUsuario, U.Nombre + ' ' + CASE 
     WHEN U.Apellido1 is NULL THEN '' 
     ELSE U.Apellido1 END + ' ' + CASE 
     WHEN U.Apellido2 is NULL THEN ' ' 
     ELSE U.Apellido2 END AS NombreCompleto
FROM Usuario U
</pre></p>
<p>Esto nos devolverá una columna &#8220;<em>NombreCompleto</em>&#8221; con los campos concatenados correctamente, sin temor a que éstos sean NULL.</p>
<br />Posted in Nivel básico, SQL Server  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/danielggarcia.wordpress.com/170/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/danielggarcia.wordpress.com/170/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/danielggarcia.wordpress.com/170/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/danielggarcia.wordpress.com/170/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/danielggarcia.wordpress.com/170/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/danielggarcia.wordpress.com/170/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/danielggarcia.wordpress.com/170/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/danielggarcia.wordpress.com/170/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/danielggarcia.wordpress.com/170/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/danielggarcia.wordpress.com/170/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/danielggarcia.wordpress.com/170/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/danielggarcia.wordpress.com/170/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/danielggarcia.wordpress.com/170/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/danielggarcia.wordpress.com/170/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=danielggarcia.wordpress.com&amp;blog=7628136&amp;post=170&amp;subd=danielggarcia&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://danielggarcia.wordpress.com/2009/05/20/concatenar-campos-nulos-en-una-consulta-sql/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/0e19fd20a30938297df19f63e79e0578?s=96&#38;d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96&#38;r=G" medium="image">
			<media:title type="html">danielggarcia</media:title>
		</media:content>
	</item>
		<item>
		<title>Obteniendo el esquema de una Tabla de SQL Server</title>
		<link>http://danielggarcia.wordpress.com/2009/05/19/obteniendo-el-esquema-de-una-tabla-de-sql-server/</link>
		<comments>http://danielggarcia.wordpress.com/2009/05/19/obteniendo-el-esquema-de-una-tabla-de-sql-server/#comments</comments>
		<pubDate>Tue, 19 May 2009 05:48:28 +0000</pubDate>
		<dc:creator>Daniel García</dc:creator>
				<category><![CDATA[C#]]></category>
		<category><![CDATA[Nivel intermedio]]></category>
		<category><![CDATA[SQL Server]]></category>
		<category><![CDATA[Database]]></category>
		<category><![CDATA[Esquema]]></category>
		<category><![CDATA[Metadatos]]></category>

		<guid isPermaLink="false">http://danielggarcia.wordpress.com/?p=166</guid>
		<description><![CDATA[Hay lugares en los que la generación automática de código no está del todo bien vista. Sin embargo, utilizando las herramientas apropiadas, un generador de código simple puede ahorrar muchas horas de trabajo. Esta introducción parece no tener demasiado que ver con el título del artículo, pero en realidad está bastante relacionada. La razón es [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=danielggarcia.wordpress.com&amp;blog=7628136&amp;post=166&amp;subd=danielggarcia&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Hay lugares en los que la generación automática de código no está del todo bien vista. Sin embargo, utilizando las herramientas apropiadas, un generador de código simple puede ahorrar muchas horas de trabajo.<br />
Esta introducción parece no tener demasiado que ver con el título del artículo, pero en realidad está bastante relacionada.</p>
<p>La razón es la siguiente: hemos visto <a title="Construyendo un DAO simple en C#" href="http://danielggarcia.wordpress.com/2009/05/16/abstraccion-de-datos-ii-construyendo-un-dao-simple-en-c/" target="_blank">previamente</a>, cuando hablábamos del patrón DAO, que la necesidad de crear entidades DTO para cada tabla de la base de datos era una realidad.</p>
<p>Bien, hasta aquí todo claro. Pero&#8230; ¿y si fuese posible crear estos ficheros de forma automática? ¿Cómo? Preguntándole a la base de datos qué tablas y campos posee, y generando a partir de ellos el código necesario para implementar un DTO. Y todo ello sin despeinarnos.<br />
Este artículo trata de hacer un breve inciso en el principio en el que se basa dicha generación de código. Únicamente veremos el mecanismo por el cual preguntar a la base de datos por estos parámetros. Hecho esto, podremos crear un fichero fuente con facilidad.</p>
<p>Para comenzar, declararemos un método que, a partir de una conexión de tipo Sql Server, devuelva un DataSet con una colección de tablas, cuyo nombre sea el propio nombre de la tabla y sus campos sean los datos de dichas tablas que queramos obtener.</p>
<p><pre class="brush: csharp;">

      public DataSet ObtenerEsquemaBD(SqlConnection Conexion)
        {
</pre></p>
<p>Lo primero que haremos será abrir la conexión, con su correspondiente comprobación de nulos (es decir, si la conexión existe o no).</p>
<p><pre class="brush: csharp;">
            try
            {
                if (!(Conexion == null))
                {
                    // Abrimos la conexión
                    if (!(Conexion.State == ConnectionState.Open))
                    {
                        Conexion.Open();
                    }

</pre></p>
<p>Seguidamente, crearemos un DataTable para almacenar los nombres de las tablas de la base de datos, así como un DataSet y un DataAdapter para almacenar los datos de las consultas. Utilizaremos una cadena de texto para almacenar las sentencias de las consultas.</p>
<p><pre class="brush: csharp;">
                    // Creamos un DataTable para almacenar los nombres de las tablas de la base de datos
                    DataTable dtTablas = new DataTable();

                    // Creamos un DataSet y un DataAdapter para obtener los datos
                    DataSet ds = new DataSet();
                    SqlDataAdapter da = new SqlDataAdapter();

                    // Declaramos una cadena para la consulta
                    string sSQL;
</pre></p>
<p>Indicaremos que queremos obtener las tablas de la Base de Datos, y lo almacenamos en el DataTable destinado a ello mediante el DataAdapter</p>
<p><pre class="brush: csharp;">
                    sSQL = &quot;SELECT TABLE_NAME as Tabla FROM Information_Schema.Tables&quot;;
                    da.SelectCommand = new SqlCommand(sSQL, Conexion);
                    da.Fill(dtTablas);
</pre></p>
<p>Ahora recorreremos la tabla que contiene los nombres de cada tabla, realizando una consulta por cada una de ellas. En esta consulta obtendremos datos como el nombre de columna, si admite nulos o no, el tipo de dato&#8230;<br />
<pre class="brush: csharp;">
                    foreach (DataRow dr in dtTablas.Rows)
                    {
                        if(!dr.IsNull(&quot;Tabla&quot;))
                        {
                            DataTable dt = new DataTable();
                            sSQL = (&quot;SELECT TABLE_CATALOG as Db, TABLE_NAME as Tabla, ORDINAL_POSITION as Posicion, COLUMN_NAME as Columna&quot; +
                            &quot;, IS_NULLABLE as AdmiteNulos, DATA_TYPE as TipoDatos, CHARACTER_MAXIMUM_LENGTH as MaxChar FROM Infor&quot; +
                            &quot;mation_Schema.Columns WHERE TABLE_NAME = \'&quot;
                                        + (dr[&quot;Tabla&quot;].ToString() + &quot;\'&quot;));
                            da.SelectCommand = new SqlCommand(sSQL, Conexion);
                            da.Fill(dt);

                            // Hecha la consulta, añadimos la tabla obtenida por este procedimiento a nuestro DataSet
                            dt.TableName = dr[&quot;Tabla&quot;].ToString();
                            ds.Tables.Add(dt);
                        }
                    }
</pre></p>
<p>Finalmente, cerramos la conexión y devolvemos el DataSet</p>
<p><pre class="brush: csharp;">
                    Conexion.Close();
                    return ds;
                }
                else
                {
                    Conexion.Close();
                    return null;
                }
            }
            catch (Exception ex)
            {
                throw(ex);
            }
        }
</pre></p>
<p>El resultado aparecerá en el DataSet, almacenando, por lo tanto, un esquema por cada tabla.</p>
<p><img class="aligncenter size-full wp-image-168" title="090501Tablas" src="http://danielggarcia.files.wordpress.com/2009/05/090501tablas.png?w=720" alt="090501Tablas"   /></p>
<br />Posted in C#, Nivel intermedio, SQL Server  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/danielggarcia.wordpress.com/166/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/danielggarcia.wordpress.com/166/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/danielggarcia.wordpress.com/166/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/danielggarcia.wordpress.com/166/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/danielggarcia.wordpress.com/166/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/danielggarcia.wordpress.com/166/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/danielggarcia.wordpress.com/166/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/danielggarcia.wordpress.com/166/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/danielggarcia.wordpress.com/166/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/danielggarcia.wordpress.com/166/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/danielggarcia.wordpress.com/166/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/danielggarcia.wordpress.com/166/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/danielggarcia.wordpress.com/166/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/danielggarcia.wordpress.com/166/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=danielggarcia.wordpress.com&amp;blog=7628136&amp;post=166&amp;subd=danielggarcia&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://danielggarcia.wordpress.com/2009/05/19/obteniendo-el-esquema-de-una-tabla-de-sql-server/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/0e19fd20a30938297df19f63e79e0578?s=96&#38;d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96&#38;r=G" medium="image">
			<media:title type="html">danielggarcia</media:title>
		</media:content>

		<media:content url="http://danielggarcia.files.wordpress.com/2009/05/090501tablas.png" medium="image">
			<media:title type="html">090501Tablas</media:title>
		</media:content>
	</item>
	</channel>
</rss>
