Почему ExecuteReader возвращает мне только 1 строку данных? - PullRequest
1 голос
/ 16 февраля 2012

У меня есть этот код, и он возвращает только первую строку [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 ]

5 голосов
/ 16 февраля 2012

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

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

. Здесь записываются первый и второй столбцы каждой строки.

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

2 голосов
/ 16 февраля 2012

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

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

EDIT:

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

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();
}    
0 голосов
/ 16 февраля 2012

Вот основы того, что я делаю, замените строковую часть 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();
            }
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...