DatagridView en Winforms , Est SqlDataReader automatiquement fermée à la fin de la boucle?
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;
}
}
J'ai envie de demander qui est le lecteur automatiquement fermée, car ici, ne suis pas à l'aide de lecteur.Close() et encore il est fermé? aussi , dans mes articles de table, j'ai le premier enregistrement en tant que
ItemId | Nom De L'Élément
1 Bag
2 Laptop
8 Weighing Machine
Mais, lorsque ces données sont affichées dans le datagridview, puis la ligne 1 , qui est, le nom de l'élément "SAC" n'est pas affiché. pourquoi donc?
Le débogage et de vérifier le tableau de données que vous obtenez une fois
oui, monsieur, j'ai débogué et trouvé qu'il se ferme automatiquement ? mais j'ai lu sur msdn qu'il devrait être explicitement fermée.
et que dire de l'enregistrement 1 qui n'est pas affiché? vous savez une solution pour cela?
À quel point c'est la rupture peut vous dire
dataGridView1.DataSource = dt; ---après cette ligne , j'ai vérifié à l'aide d'un messagebox et l'affichage du lecteur.IsClosed de la propriété , il donne Vrai
oui, monsieur, j'ai débogué et trouvé qu'il se ferme automatiquement ? mais j'ai lu sur msdn qu'il devrait être explicitement fermée.
et que dire de l'enregistrement 1 qui n'est pas affiché? vous savez une solution pour cela?
À quel point c'est la rupture peut vous dire
dataGridView1.DataSource = dt; ---après cette ligne , j'ai vérifié à l'aide d'un messagebox et l'affichage du lecteur.IsClosed de la propriété , il donne Vrai
OriginalL'auteur sqlchild | 2011-04-09
Vous devez vous connecter pour publier un commentaire.
En appelant
Read()
, vous avez déjà ", a affirmé" la première ligne (c'est pourquoi le Sac ne s'affiche pas - parce que vous ne faites pas n'importe quoi avec elle); et encoredt.Load
est aussi va faire unwhile(reader.Read())
. Je m'attends que vous voulez (remarque je ne suis pas d'appelRead
ici, et n'ont pas dewhile
boucle):La raison pour laquelle elle est sortie, c'est que une fois que vous avez appelé
Load
vous l'ai déjà lu toutes les données, donc il n'y a rien d'autre à lire. Honnêtement, je ne sais pas si arriver à la fin de la TDS flux ferme implicitement le lecteur, mais vous devriez être en utilisant:Si vous êtes à la l'élimination (via le
using
bloc), alors non. Mais vous responsable de faire en sorte qu'il soit éliminé.monsieur, quand je n'étais pas à l'aide de "l'aide" ,qui est, je l'ai utilisé votre code que vous avez spécifié dans la création de votre réponse , puis il a également été automatiquement fermé?
les deux choses qui font partie de la même réponse. La seule façon que je peux vraiment répondre c'est-à-dire encore une fois: si vous jetez, vous n'avez pas également à proximité. Vous devez vous toujours en disposer, de manière à le faire.
OriginalL'auteur Marc Gravell
Vous chargez le lecteur dans le DataTable donc le moment(le lecteur.Read()) boucle n'est pas nécessaire.
Le premier enregistrement ne s'affiche pas parce que lecteur.Read() a pris le premier enregistrement et dt.Load() est à partir de la deuxième enregistrement.
OriginalL'auteur Dallas
Même cela aussi fonctionne très bien pour moi
OriginalL'auteur Dorababu Meka