我有这个代码,它只返回第一个字符串[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();
}
答案 0 :(得分:5)
reader[0]
访问阅读器的第一个字段,而不是第一行。查看MSDN中的示例代码。
// Call Read before accessing data.
while (reader.Read())
{
Console.WriteLine(String.Format("{0}, {1}",
reader[0], reader[1]));
}
这会写出每行的第一列和第二列。
另外,我不确定您为什么不使用using
声明,以及为什么要在ExecuteReader
块中调用finally
- 那些看起来都很奇怪。
答案 1 :(得分:2)
您只获得一行,因为您只拨打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();
}
答案 2 :(得分:0)
以下是我所做的基础知识,将字符串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();
}
}