为什么ExecuteReader只给我1行数据?

时间:2012-02-15 22:08:11

标签: c# mysql executereader

我有这个代码,它只返回第一个字符串[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 个答案:

答案 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();
            }
        }