use*_*162 1 c# sql sql-server sqldatareader
我试图使用a 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);
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
那是对的.
当您从while循环退出时,DataReader已到达已加载数据的末尾,因此无法用于获取不存在的当前记录的值.
Read方法将SqlDataReader(dr)前进到下一条记录,如果有更多行则返回true,否则返回false.
如果您只有一条记录,则可以results这种方式使用变量
MessageBox.Show(results);
Run Code Online (Sandbox Code Playgroud)
现在,这将起作用,因为你的sql语句中有一个TOP 1,但是,如果你有多个记录,它将只显示最后一条记录的值.
另外正如marc_s在其注释中所指出的,如果你的表是空的,你的代码不会落入while循环中,所以你可能可以用以下消息初始化结果变量:
results = "No data found";
Run Code Online (Sandbox Code Playgroud)
编辑:看到下面的评论,你应该以这种方式改变你的代码
.....
// 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();
}
}
}
.....
Run Code Online (Sandbox Code Playgroud)