c# - net - recorrer un datareader
DatagridView en Winforms, ¿SqlDataReader se cierra automáticamente al final del ciclo? (3)
int a ;
SqlCommand cmd = new SqlCommand (" Select * From items order by ItemID ", conn );
SqlDataReader reader = cmd.ExecuteReader();
while(reader.Read())
{
a = reader.GetInt32(0);
if (reader.HasRows == false)
{
dataGridView1.Visible = false;
}
else
{
dataGridView1.Visible = true;
DataTable dt = null;
dt = new DataTable();
dt.Load(reader);
dataGridView1.DataSource = dt;
if (reader.IsClosed == true)
{
break;
}
}
Quiero preguntar que el lector está cerrado automáticamente, porque aquí no estoy usando reader.Close () y todavía está cerrado? también, en mi tabla de artículos tengo el primer registro como
ItemId | Nombre del árticulo
1 Bag
2 Laptop
8 Weighing Machine
Pero, cuando estos datos se muestran en la vista de cuadrícula de datos, entonces la fila 1, es decir, el nombre de elemento "BOLSA" no se muestra. ¿porque?
Al llamar a Read()
, ya ha "reclamado" la primera fila (de ahí por qué Bag no se muestra, porque no está haciendo nada con él); y sin embargo dt.Load
también va a hacer un while(reader.Read())
. Espero que quieras (ten en cuenta que no llamo a Read
aquí, y no tengo bucle while):
if(reader.HasRows)
{
// load via dt.Load() and show
}
else
{
// hide
}
La razón por la que está saliendo es que una vez que ha llamado Load
ya ha leído todos los datos, por lo que no hay nada más que leer. Honestamente, no sé si llegar al final de la secuencia de TDS cierra implícitamente al lector, pero deberías estar usando:
using(var cmd = new SqlCommand (" Select * From items order by ItemID ", conn))
using(var reader = cmd.ExecuteReader())
{
// everything else in here
}
Incluso esto también funciona bien para mí
string strcon = ConfigurationSettings.AppSettings["Constring"].ToString();
MySqlConnection conn = new MySqlConnection(strcon);
MySqlCommand cmd = new MySqlCommand("Select * From items order by ItemID", conn);
conn.Open();
MySqlDataReader reader = cmd.ExecuteReader();
if (reader.HasRows)
{
dataGridView1.Visible = true;
DataTable dt = null;
dt = new DataTable();
dt.Load(reader);
dataGridView1.DataSource = dt;
}
Está cargando el lector en la DataTable por lo que el ciclo while (reader.Read ()) no es necesario.
El primer registro no se muestra porque reader.Read () ha tomado el primer registro y dt.Load () está comenzando desde el segundo registro.
using (SqlConnection connection = new SqlConnection(connectionString))
{
using (SqlCommand cmd = connection.CreateCommand())
{
cmd.CommandText = "SELECT * FROM teams";
connection.Open();
using (SqlDataReader reader = cmd.ExecuteReader())
{
if (reader.HasRows)
{
dataGridView.Visible = true;
DataTable dt = new DataTable();
dt.Load(reader);
dataGridView.DataSource = dt;
}
else
{
dataGridView.Visible = false;
}
}
}
}