我正在尝试使用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);
}
}
}
}
答案 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();
}
}
}
.....