C sharp - Ejecución directa de comandos SQL en C#

   
Vista:

Ejecución directa de comandos SQL en C#

Publicado por Hector (1 intervención) el 10/02/2016 16:46:10
Hola, tengo un problema en la ejecución de comandos SQL en forma directa desde C# con DataReader y es que cuando doy click en el botón button1 (único botón de un programa Winform de ejemplo) se ejecuta correctamente la linea:

1
DATA_READER = COMANDO.ExecuteReader();

Sin embargo, cuando se da click en button1 por segunda vez a fin de mostrar la segunda fila de la tabla, la instrucción anterior provoca la siguiente excepción:

---------------------------------------------------------------------------------------------------------------------------------------------------

Excepción no controlada del tipo 'System.InvalidOperationException' en System.Data.dll

Información adicional: Ya hay un DataReader abierto asociado a este Command, debe cerrarlo primero.

---------------------------------------------------------------------------------------------------------------------------------------------------

Y para mi esto no tiene ninguna lógica pues no deseo hacer el Close hasta tanto no haya leido todas las filas de la tabla.
A continuación te muestro el programita de ejemplo.

PROGRAMA DOCENTE DE EJEMPLO:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
using LN;
using System.Data;
using System.Data.SqlClient;
 
namespace ComandosSQL
{
    public partial class Form1 : Form
        {
        //-------------------------------------------------------------------------------------------------------------------------------------
 
        // Instanciar un objeto de tipo LN para usar los métodos de dicha biblioteca (Objeto MensINFO)
        LN.LN OBJ = new LN.LN(); // Uso de una biblioteca particular que no tiene que ver directamente con el tema
        //-------------------------------------------------------------------------------------------------------------------------------------
 
        // Aqui comienza el código asociado a la ejecución de comandos SQL dentro del programa
 
        //-------------------------------------------------------------------------------------------------------------------------------------
        SqlCommand COMANDO;
        SqlDataReader DATA_READER;
        public SqlConnection CONEXION =new SqlConnection(@"Data Source=PCHFC\SQLEXPRESS;Initial Catalog=SEGUROS;Persist Security Info=True;User ID=sa;Password=adivina");
        //----------------------------------------------------
        public Form1()
            {
            InitializeComponent();
 
            // Al inicio del programa definimos el string del QUERY que vamos a usar y se abre la conexión (Open())
 
            COMANDO = new SqlCommand(@"SELECT * FROM dbo.SEGUROS_DE_SALUD", CONEXION);
            CONEXION.Open();
            }
 
 
        // Cada vez que se da click en el unico botón del formulario entramos en esta secuencia
 
 
        private void button1_Click(object sender, EventArgs e)
            {
            DATA_READER = COMANDO.ExecuteReader(); <== Esta instrucción se ejecuta correctamente solo la 1ra vez
 
                                                       pues cuando se pasa por aqui la segunda vez se produce
 
                                                       la excepción. Porque sucede esto?
            if  (DATA_READER.Read())
                {
                OBJ.MensINFO(Convert.ToString(DATA_READER[0] + @" | " + DATA_READER[1]));
                return;
                }
            CONEXION.Close();
            Application.Exit();
            }
        }
}
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Wilfredo Patricio Castillo

Ejecución directa de comandos SQL en C#

El mensaje de la excepción es muy claro y específico.

El datareader ya está abierto y no lo puedes volver a ejecutar a menos que lo cierres

Al ejecutar esta linea:
1
DATA_READER = COMANDO.ExecuteReader();

lo que tienes que hacer es:
1
2
3
4
5
6
7
8
9
10
11
if(DATA_READER.Hasrows)
{
While(DATA_READER.READ())
{
  TuObjeto.PropiedadString=DATA_READER.GetString(0);
TuObjeto.PropiedadInteger=DATA_READER.GetInt32(1);
TuLista_DE_Objetos.ADD(TuObjeto)
}
}
DATA_READER.Close();
Return TuLista_DE_Objetos();



Así que aquí no hay nada de incoherente, documéntate bien al respecto.

Saludos cordiales,
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Wilfredo Patricio Castillo

Ejecución directa de comandos SQL en C#

Publicado por Wilfredo Patricio Castillo (180 intervenciones) el 10/02/2016 22:12:47
Gracias Wilfredo, muy agradecido.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar