SQL数据读取器:没有数据时读取的尝试无效

时间:2012-11-29 21:49:07

标签: c# sql sql-server sqldatareader

我正在尝试使用SqlDataReader运行查询,然后在消息框中显示结果,但我一直收到错误

  

无数据时无效尝试读取。

这是我的代码。

 public void button1_Click(object sender, EventArgs e)
 {
    string results = "";
    using (SqlConnection cs = new SqlConnection(@"Server=100-nurex-x-001.acds.net;Database=Report;User Id=reports;Password=mypassword"))
    {
         cs.Open();
         string query = "select stationipaddress from station where stationname = @name";
         using (SqlCommand cmd = new SqlCommand(query, cs))
         {
              // Add the parameter and set its value -- 
              cmd.Parameters.AddWithValue("@name", textBox1.Text);
              using (SqlDataReader dr = cmd.ExecuteReader())
              {
                   while (dr.Read())
                   {
                        label3.Text = dr.GetSqlValue(0).ToString();
                        results = dr.GetValue(0).ToString();
                        //MessageBox.Show(dr.GetValue(0).ToString());
                        //MessageBox.Show(results);
                    }
                    MessageBox.Show(results);
              }
         }
    } 
}

1 个答案:

答案 0 :(得分:6)

这是正确的。
当您从while循环退出时,DataReader已到达已加载数据的末尾,因此无法用于获取不存在的当前记录的值。

Read方法将SqlDataReader(dr)推进到下一条记录,如果有更多行则返回true,否则返回false。

如果您只有一条记录,则可以这种方式使用results变量

MessageBox.Show(results);

现在,这将起作用,因为你的sql语句中有一个TOP 1,但是,如果你有多个记录,它将只显示最后一条记录的值。

另外正如marc_s在其评论中所指出的,如果你的表是空的,你的代码不属于while循环,所以你可能会用以下消息初始化结果变量:

 results = "No data found";

编辑:在下面看到您的评论,那么您应该以这种方式更改您的代码

.....
// Use parameters **ALWAYS** -- **NEVER** cancatenate/substitute strings 
string query = "select stationipaddress from station where stationname = @name";
using (SqlCommand cmd = new SqlCommand(query, cs))
{
    // Add the parameter and set its value -- 
    cmd.Parameters.AddWithValue("@name", textBox1.Text);
    using (SqlDataReader dr = cmd.ExecuteReader())
    {

        while (dr.Read())
        {
            label3.Text = dr.GetSqlValue(0).ToString();
            results = dr.GetValue(0).ToString();
        }
    }
}
.....