Winforms中的DatagridView,SqlDataReader是否在循环结束时自动关闭?

sql*_*ild 3 .net c# datagridview sql-server-2005 sqldatareader

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;
                }   
            }
Run Code Online (Sandbox Code Playgroud)

我想问问读者是否自动关闭了,因为这里没有使用reader.Close()仍然关闭了吗?另外,在我的项目表中,我有第一条记录为

ItemId | 项目名

 1       Bag
 2       Laptop
 8       Weighing Machine 
Run Code Online (Sandbox Code Playgroud)

但是,当此数据显示在datagridview中时,则不显示行1,即项目名称“ BAG”。为什么这样?

Mar*_*ell 5

通过调用Read(),您已经“声明”了第一行(因此,为什么Bag不显示-因为您没有对其进行任何操作);然而dt.Load打算做while(reader.Read())。我希望您想要(请注意,我没有Read在这里打电话,并且没有while循环):

if(reader.HasRows)
{
   // load via dt.Load() and show
}
else
{
     // hide
}
Run Code Online (Sandbox Code Playgroud)

退出的原因是,一旦调用,Load您就已经读取了所有数据,因此没有其他要读取的数据。老实说,我不知道到达TDS流的结尾是否暗中关闭了读者,但是您应该使用:

using(var cmd = new SqlCommand (" Select * From items order by ItemID ", conn))
using(var reader = cmd.ExecuteReader()) 
{
     // everything else in here
} 
Run Code Online (Sandbox Code Playgroud)