Почему ExecuteReader возвращает мне только 1 строку данных?

У меня есть этот код, и он возвращает только первую строку [0] и ошибки в остальных, говоря, что индекс находится вне массива, что означает, что только 1 строка извлекается, но я не знаю, почему!!!

MySqlConnection connection = new MySqlConnection(MyConString);
MySqlCommand command = new MySqlCommand("SELECT email_address FROM account_info", connection);
MySqlDataReader reader;

try
{

    connection.Open();
    reader = command.ExecuteReader();
     if (reader.HasRows)
    {
        while (reader.Read())
        {
            textBox1.Text = reader[0].ToString();

            textBox2.Text = reader[0].ToString();

            textBox3.Text = reader[0].ToString();
        }


        reader.Close();
    }

3 ответа

Решение

Вы получаете только один ряд, потому что вы только звоните reader.Read() один раз. Каждый раз, когда вы звоните Read()читатель переходит к следующему ряду и возвращает true; или, когда читатель проходит мимо последней строки, он возвращает false.

Индексатор возвращает данные из дополнительных столбцов, и у вас есть только один столбец в вашем запросе; вот почему индексы 1 и 2 терпят неудачу.

РЕДАКТИРОВАТЬ:

Если вы пытаетесь перебрать читателя, вам нужно поместить три текстовых поля в структуру, где они также могут быть зациклены. Проще, но менее гибко, но правильно:

if (reader.HasRows) 
{ 
    reader.Read()
    textBox1.Text = reader[0].ToString(); 
    reader.Read()
    textBox2.Text = reader[0].ToString(); 
    reader.Read()
    textBox3.Text = reader[0].ToString(); 
    reader.Close(); 
} 

более гибкий:

List<TextBox> boxes = new List<TextBox> { textBox1, textBox2, textBox3 };
for (int index = 0; index < boxes.Count; index++)
{
    if (!reader.Read())
    {
        break;  // in case there are fewer rows than text boxes
    }
    boxes[index] = reader[0].ToString();
}    

reader[0] обращается к первому полю от читателя, а не к первому ряду. Проверьте пример кода из MSDN.

// Call Read before accessing data.
while (reader.Read())
{
    Console.WriteLine(String.Format("{0}, {1}",
            reader[0], reader[1]));
}

Это записывает первый и второй столбцы каждой строки.

Кроме того, я не совсем уверен, почему вы не используете using Скажите, а почему вы звоните ExecuteReader в finally блок - оба выглядят странно

Вот основы того, что я делаю, замените строковую часть EmailAddress на то, что вам нужно:

        using (SqlConnection SQL_Conn01 = new SqlConnection(SQLSync))
        {
            bool IsConnected = false;
            try
            {
                SQL_Conn01.Open();
                IsConnected = true;
            }
            catch
            {
                // unable to connect
            }
            if (IsConnected)
            {

                SqlCommand GetSQL = new SqlCommand("SELECT email_address FROM account_info", SQL_Conn01);

                using (SqlDataReader Reader = GetSQL.ExecuteReader())
                {
                    while (Reader.Read())
                    {
                        string EmailAddress = Reader.GetString(0).TrimEnd();
                    }
                }
                GetSQL.Dispose();
            }
        }
Другие вопросы по тегам