DatagridView в Winforms, SqlDataReader автоматически закрывается в конце цикла? - PullRequest
3 голосов
/ 09 апреля 2011
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;
                }   
            }

Я хочу спросить, читатель закрывается автоматически, потому что здесь не используется reader.Close (), и все же он закрыт? Кроме того, в моей таблице предметов у меня есть первая запись как

ItemId | ItemName

 1       Bag
 2       Laptop
 8       Weighing Machine 

Но когда эти данные отображаются в сетке данных, тогда строка 1, то есть имя элемента "BAG", не отображается. почему так?

Ответы [ 3 ]

5 голосов
/ 09 апреля 2011

Позвонив по номеру Read(), вы уже «забрали» первый ряд (следовательно, почему Bag не отображается - потому что вы ничего с ним не делаете);и все же dt.Load это также собирается сделать while(reader.Read()).Я ожидаю, что вы хотите (заметьте, я не звоню Read здесь, и у вас нет петли while):

if(reader.HasRows)
{
   // load via dt.Load() and show
}
else
{
     // hide
}

Причина, по которой он выходит, состоит в том, что, как только вы позвонили LoadВы уже прочитали все данные, поэтому больше нечего читать.Честно говоря, я не знаю, закрывает ли читатель неявное завершение потока TDS, но вы должны использовать:

using(var cmd = new SqlCommand (" Select * From items order by ItemID ", conn))
using(var reader = cmd.ExecuteReader()) 
{
     // everything else in here
} 
4 голосов
/ 09 апреля 2011

Вы загружаете ридер в DataTable, поэтому цикл while (reader.Read ()) не требуется.

Первая запись не отображается, потому что reader.Read () взял первую запись, а dt.Load () начинается со второй записи.

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;
            }
        }
    }
}
1 голос
/ 09 апреля 2011

Даже у меня это тоже отлично работает

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;
}
...