Почему 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();
}
}