<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-32069595</id><updated>2011-09-16T16:02:43.443-06:00</updated><title type='text'>sin software solo son fierros</title><subtitle type='html'>Integrando los conocimientos teoricos en la practica del desarrollo de software.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://burrito20.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32069595/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://burrito20.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Cesar Guzman</name><uri>http://www.blogger.com/profile/14684754439273444115</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://photos1.blogger.com/blogger/4382/3346/1600/cesar.0.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>2</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-32069595.post-3389984241348179250</id><published>2009-08-18T13:46:00.000-06:00</published><updated>2009-08-18T13:47:45.109-06:00</updated><title type='text'>C# y Patrones de diseño</title><content type='html'>&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32069595-3389984241348179250?l=burrito20.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://burrito20.blogspot.com/feeds/3389984241348179250/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32069595&amp;postID=3389984241348179250' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32069595/posts/default/3389984241348179250'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32069595/posts/default/3389984241348179250'/><link rel='alternate' type='text/html' href='http://burrito20.blogspot.com/2009/08/c-y-patrones-de-diseno.html' title='C# y Patrones de diseño'/><author><name>Cesar Guzman</name><uri>http://www.blogger.com/profile/14684754439273444115</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://photos1.blogger.com/blogger/4382/3346/1600/cesar.0.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32069595.post-256401903590240642</id><published>2007-05-09T09:49:00.000-06:00</published><updated>2007-05-09T12:02:53.833-06:00</updated><title type='text'>Introduccion a ADO.NET</title><content type='html'>&lt;span style="font-family:verdana;"&gt;ADO.Net es la interface para escribir aplicaciones que interactuan con bases de datos. Esta compuesta por un conjunto de clases de la BCL del .NET Framework, las cuales vamos a estudiar una por una a detalle.&lt;br /&gt;&lt;br /&gt;Vamos a empezar con el estudio de las clases basicas: Connection, Command y DataReader&lt;br /&gt;&lt;br /&gt;Para conectar nuestra aplicacion con el origen de los datos (tipicamente un servidor de bases de datos) usaremos un ejemplar (objeto) de la clase &lt;span style="font-weight: bold;"&gt;Connection&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Los ejemplares de la clase &lt;span style="font-weight: bold;"&gt;Command&lt;/span&gt; nos van a permitir enviar comandos hacia el servidor para que este los ejecute.&lt;br /&gt;&lt;br /&gt;Si la orden enviada al servidor es &lt;span style="font-weight: bold;"&gt;una consulta&lt;/span&gt; entoces vamos a requerir un ejemplar de la clase &lt;span style="font-weight: bold;"&gt;DataReader&lt;/span&gt; para recibir cada registro de datos que el servidor va e anviar como respuesta a la consulta.&lt;br /&gt;&lt;br /&gt;Antes de continuar es necesario aclarar que las clases anteriores sirven para definir el comportamiento antes mencionado y no las utilizaremos directamente. En su lugar usaremos clases especificas para cada origen de datos con los que queramos interactuar. A estas clases especificas se les denomina "proveedores de datos". Actualmente estan disponible en Visual Studio los siguientes:&lt;br /&gt;&lt;hr /&gt;&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li style="font-weight: bold;"&gt;&lt;span style="font-family:verdana;"&gt;SqlServer&lt;/span&gt;&lt;/li&gt;&lt;ul&gt;&lt;li&gt;&lt;span style=";font-family:verdana;font-size:85%;"  &gt;Clases :  SqlConnection, SqlCommand, SqlDataReader, SqlDataAdapter&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=";font-family:verdana;font-size:85%;"  &gt;Espacio de nombres: System.Data.SqlClient&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;span style="font-family:verdana;"&gt;&lt;/span&gt;&lt;ul&gt;&lt;li style="font-weight: bold;"&gt;&lt;span style="font-family:verdana;"&gt;Oracle&lt;/span&gt;&lt;/li&gt;&lt;ul&gt;&lt;li&gt;&lt;span style=";font-family:verdana;font-size:85%;"  &gt;Clases : OracleConnection, OracleCommand, OracleDataReader, OracleDataAdapter&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=";font-family:verdana;font-size:85%;"  &gt;Espacio de nombres : System.Data.OracleClient&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;span style="font-family:verdana;"&gt;&lt;/span&gt;&lt;ul&gt;&lt;li style="font-weight: bold;"&gt;&lt;span style="font-family:verdana;"&gt;Ole DB&lt;/span&gt;&lt;/li&gt;&lt;ul&gt;&lt;li&gt;&lt;span style=";font-family:verdana;font-size:85%;"  &gt;Clases : OleDdConnection,OleDbCommand, OleDbDataReader, OleDbDataAdapter&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=";font-family:verdana;font-size:85%;"  &gt;Espacio de nombres : System.Data.OleDd&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;span style="font-family:verdana;"&gt;&lt;/span&gt;&lt;ul&gt;&lt;li style="font-weight: bold;"&gt;&lt;span style="font-family:verdana;"&gt;ODBC&lt;/span&gt;&lt;/li&gt;&lt;ul&gt;&lt;li&gt;&lt;span style=";font-family:verdana;font-size:85%;"  &gt;Clases : OdbcConnection,OdbcCommand, OdbcDataReader, OdbcDataAdapter&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=";font-family:verdana;font-size:85%;"  &gt;Espacio de nombres : System.Data.Odbc&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;span style="font-family:verdana;"&gt;&lt;br /&gt;&lt;hr /&gt;&lt;br /&gt;Estos son los que distribuye Microsoft, sin embargo se encuentran disponible algunos mas desarrollados por terceros, por ejemplo para el servidor FireBird entre otros.&lt;br /&gt;Es importante repetir que las caracteristicas de todos ellos son similares.&lt;br /&gt;Los ejemplos desde este punto en adelante los vamos a tratar con el proveedor de Sql Server (SqlConnection, SqlCommand, SqlDataReader y SqlDataAdapter) pero recordando siempre sera lo mismo para cualquiera de los otros.&lt;br /&gt;&lt;br /&gt;Entonces, para conectarnos a un servidor SqlServer debemos crear un ejemplar de la clase SqlConnection, configurar la propiedad ConnectionString y ejecutar el metodo Open().&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:78%;"&gt;&lt;span style="font-weight: bold;"&gt;SqlConnection conx = new SqlConnection;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;conx.ConnectionString = "Data Source = NombreServidor;  Initial Catalog = BaseDatos; Integrated Security = Yes";&lt;br /&gt;conx.Open();&lt;br /&gt;...&lt;br /&gt;conx.Close();&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;La propiedad ConnectionString, es una cadena de caracteres que define una seria de parametros separados por ";" y cada uno de estos debe tener un valor. Los parametros dependen del tipo servidor. Para el caso de Sql Server estos son varios pero obligatoriamente debemos poner los siguientes :&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-family:verdana;"&gt;&lt;span style="font-weight: bold;font-size:85%;" &gt;Data Source = &lt;/span&gt;&lt;span style="font-size:85%;"&gt;nombre o direccion IP del equipo en el que esta corriendo SqlServer&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:verdana;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-weight: bold;"&gt;Initial Catalog &lt;/span&gt;= nombre de la base de datos con la cual vamos a trabajar&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-family:verdana;"&gt;&lt;/span&gt;&lt;span style="font-family:verdana;"&gt;Tambien es necesario especificar nuestro nombre de usuario y contraseña, en el caso de SqlServer existen dos posibilidades:&lt;br /&gt;&lt;br /&gt;Enviar nombre de usuario y contraseña definidos en el servidor mediante los siguientes parametros:&lt;br /&gt;&lt;/span&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-family:verdana;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-weight: bold;"&gt;user ID &lt;/span&gt;= nombre de usuario&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:verdana;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-weight: bold;"&gt;pwd&lt;/span&gt; = contraseña&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-family:verdana;"&gt;&lt;br /&gt;o bien, utilizar el nombre de usuario y contraseña con los que se inicio la sesion en Windows (seguridad integrada), mediante el siguiente parametro:&lt;br /&gt;&lt;/span&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-family:verdana;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-weight: bold;"&gt;Integrated Security&lt;/span&gt; = Yes&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-family:verdana;"&gt;Despues de especificar la propiedad ConnectionString ya estamos en condiciones de iniciar o abrir la coneccion, esto se realiza llamando al metodo &lt;span style="font-weight: bold;"&gt;Open()&lt;/span&gt; del objeto SqlConnection. Cuando ya no vamos a trabajar con el servidor vamos a cerrar la coneccion llamando al metodo &lt;span style="font-weight: bold;"&gt;Close()&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Despues de abrir la coneccion nuestro programa esta en condiciones de pedirle al servidor que ejecute alguna instruccion o procedimiento almacenado. Estas  seran instrucciones en el lenguage  SQL y se enviaran solo a traves de un ejemplar de la clase Command. Los pasos para enviar una instruccion son:&lt;br /&gt;&lt;br /&gt;crear el ejemplar :&lt;br /&gt;&lt;span style="font-weight: bold;font-size:78%;" &gt;&lt;br /&gt;SlqCommand inst = new SqlCommand( )&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;establecer las propiedades Connection y CommandText :&lt;br /&gt;&lt;span style="font-size:78%;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;inst.Connection = conx;                                              &lt;/span&gt;// conx es un ejemplar de SqlConnection&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;inst.CommandText = "Delete From Alumnos";  &lt;/span&gt; // aqui va la instruccion o el nombre del procedimiento almacenado&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;enviar la instruccion al servidor para que este la ejecute. Para esto se utilizara uno de los metodos execute del command :&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:78%;"&gt;&lt;span style="font-weight: bold;"&gt;inst.ExecuteNonQuery(); &lt;/span&gt;// Si  la instruccion  o procedimiento &lt;span style="font-weight: bold;"&gt;no&lt;/span&gt; es una consulta (Select ... )&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;inst.ExecuteScalar();       &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:verdana;"&gt;&lt;span style="font-size:78%;"&gt;// Si  la instruccion  o procedimiento &lt;span style="font-weight: bold;"&gt;&lt;/span&gt;es una consulta (Select ... ) y solo regresa un valor&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:verdana;"&gt;&lt;span style="font-size:78%;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;inst.ExecuteReader();&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:verdana;"&gt;&lt;span style="font-size:78%;"&gt;&lt;span style="font-weight: bold;"&gt;     &lt;/span&gt;// Si  la instruccion  o procedimiento &lt;span style="font-weight: bold;"&gt;&lt;/span&gt;es una consulta (Select ... )&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:verdana;"&gt;&lt;span style="font-size:78%;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;En nuestro ejemplo la instruccion es &lt;span style="font-weight: bold;"&gt;"Delete From Alumnos&lt;/span&gt;" por lo tanto se enviara al servidor de esta forma:&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:verdana;"&gt;&lt;span style="font-size:78%;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;inst.ExecuteNonQuery(); &lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;Ademas ExecuteNonQuery() retorna un entero que indica la cantidad de registros afectados por la instruccion enviada.&lt;br /&gt;&lt;br /&gt;Si la instruccion fuera una consulta que regresa solo un valor, por ejemplo &lt;span style="font-weight: bold;"&gt; "Select Count(*) From Alumnos&lt;/span&gt;" la instruccion adecuada es&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:verdana;"&gt;&lt;span style="font-size:78%;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;int alumno = (int) inst.ExecuteScalar(); &lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;El metodo ExecuteScalar() retorna un valor de tipo Object por lo que es necesario hacer una conversion (cast) al tipo de dato correcto, en el ejemplo  el tipo real que retorna es un entero.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:verdana;"&gt;Si la instruccion fuera una consulta que regresa un numero indeterminado de datos, por ejemplo &lt;span style="font-weight: bold;"&gt; "Select Matricula,Nombre From Alumnos&lt;/span&gt;" la instruccion adecuada es&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:verdana;"&gt;&lt;span style="font-size:78%;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;SqlDataReader  lector;&lt;br /&gt;lector = inst.ExecuteReader();&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;En este caso se va a utilizar el metodo ExecuteReader(). Este metodo provoca las siguientes acciones:&lt;br /&gt;&lt;/span&gt;&lt;ol&gt;&lt;li&gt;&lt;span style="font-family:verdana;"&gt;&lt;span style="font-size:85%;"&gt;Envia la consulta el servidor.&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:verdana;"&gt;&lt;span style="font-size:85%;"&gt;Crea un ejemplar de la clase SqlDataReader y lo prepara (abre ) para recuperar los datos provenientes de servidor.&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:verdana;"&gt;&lt;span style="font-size:85%;"&gt;Regresa una referencia hacia el ejemplar creado.&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;span style="font-family:verdana;"&gt;Por lo tanto es nuestra obligacion almacenar la referencia al SqlDataReader en una variable para poder recuperar la informacion que envie el servidor. En el ejemplo anterior la variable utilizada se llama lector.&lt;br /&gt;&lt;br /&gt;Una vez que tenemos el DataReader podemos empezar a recuperar cada registro de datos que envie el servidor ejecutando repetidamente el metodo &lt;span style="font-weight: bold;"&gt;Read() &lt;/span&gt;de este. La ejecucion del metodo Read() provoca que el servidor envie un registro de datos si es que hay alguno disponible.&lt;br /&gt;&lt;br /&gt;En caso de que efectivamente se reciba un registro de datos, el DataReader lo almacena internamente y el metodo retorna un valor &lt;span style="font-weight: bold;"&gt;true&lt;/span&gt;, de lo contrario retorna un &lt;span style="font-weight: bold;"&gt;false&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Es muy importante tener en cuenta que el DataReader solo tiene capacidad de almacenar los datos el ultimo registro recuperado (cada nuevo registro sustituye los datos del anterior) por lo que es nuestra obligacion hacer&lt;br /&gt;algo con los datos recibidos antes de llamar de  nuevo al metodo Read(). Como  ejemplo vamos mostrar en pantalla los datos recibidos en la consulta anterior:&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:verdana;"&gt;&lt;span style="font-size:78%;"&gt;&lt;span style="font-weight: bold;"&gt;SqlDataReader  lector;&lt;br /&gt;lector = inst.ExecuteReader();&lt;br /&gt;&lt;br /&gt;while (lector.Read( ) ){                                             &lt;/span&gt;// recuperamos un registro de datos&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;mat =  lector.GetString(0);    &lt;/span&gt;                       // obtenemos el valor de la primer columna&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;nom = lector.GetString(1);                                   &lt;/span&gt;// &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:verdana;"&gt;&lt;span style="font-size:78%;"&gt;obtenemos el valor de la segunda columna&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;Console.WriteLine("{0}   {1}", mat, nom);&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:verdana;"&gt;&lt;span style="font-size:78%;"&gt;&lt;span style="font-weight: bold;"&gt;}&lt;br /&gt;lector.Close();   // &lt;span style="color: rgb(255, 0, 0);"&gt;muy importante&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:verdana;"&gt;&lt;br /&gt;Para obtener los datos almacenados en un DataReader disponemos de los metodos GetXXX ( GetString, GetInt32, GetBoolean, etc.), debemos utilizar el correcto segun el tipo de dato. Cada uno de estos recibe como argumento un entero que indica la posicion de la columna de datos deseada (la numeracion empieza en cero).&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:verdana;"&gt;&lt;br /&gt;Si bien podemos tener cualquier cantidad de ejemplares DataReader al mismo tiempo, solo es posible tener abierto uno de ellos a la vez por lo que muy importante llamar al metodo Close() del DataReader una vez que ya no lo ocupamos. Si no lo hacemos seguramente tendremos problemas como el siguiente :&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:verdana;"&gt;&lt;span style="font-size:78%;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;SqlDataReader  lector1, lector2;&lt;br /&gt;lector = inst1.ExecuteReader();&lt;br /&gt;&lt;br /&gt;while (lector1.Read( ) ){                                             &lt;/span&gt;&lt;br /&gt;// hacer algo&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:verdana;"&gt;&lt;span style="font-size:78%;"&gt;&lt;span style="font-weight: bold;"&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:verdana;"&gt;&lt;span style="font-size:78%;"&gt;&lt;span style="font-weight: bold;"&gt; lector = inst2.ExecuteReader();   &lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;// esta instruccion va a provocar una excepcion ( un fallo en tiempo de ejecucion)&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;br /&gt;while (lector2.Read( ) ){                                             &lt;/span&gt;&lt;br /&gt;// hacer algo&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:verdana;"&gt;&lt;span style="font-size:78%;"&gt;&lt;span style="font-weight: bold;"&gt;}&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;El error se va a dar en la siguiente linea&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:verdana;"&gt;&lt;span style="font-size:78%;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;lector = inst2.ExecuteReader();   &lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;&lt;br /&gt;Anteriormente vimos que el metodo ExecuteReader() entre otras cosas crea y abre un SqlDataReader, entonces el error se provoca cuando este metodo intenta abrir el SqlDataReader recien creado porque existe otro SqlDataReader abierto.&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32069595-256401903590240642?l=burrito20.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://burrito20.blogspot.com/feeds/256401903590240642/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32069595&amp;postID=256401903590240642' title='1 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32069595/posts/default/256401903590240642'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32069595/posts/default/256401903590240642'/><link rel='alternate' type='text/html' href='http://burrito20.blogspot.com/2007/05/introduccion-adonet.html' title='Introduccion a ADO.NET'/><author><name>Cesar Guzman</name><uri>http://www.blogger.com/profile/14684754439273444115</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://photos1.blogger.com/blogger/4382/3346/1600/cesar.0.jpg'/></author><thr:total>1</thr:total></entry></feed>
