【发布时间】:2017-05-01 17:22:15
【问题描述】:
我正在尝试使用 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);
}
}
}
}
【问题讨论】:
-
只是一个见解:您的查询文本不需要任何格式。换句话说,您不需要将文本传递给 string.Format()。您可以像这样简单地分配它:string query = @"select top 1 stationipaddress from station"。
-
如果您的
SELECT没有返回任何数据,那么您对while (dr.Read())的调用将立即终止(没有什么可读取的!),但是两行之后,您仍然可以访问MessageBox.Show(dr.GetValue(0).ToString());和那会惨败……为什么这条线在while (dr.Read())块之外?您应该将值读入块内部的字符串变量中,然后将其用于消息框.... -
只是一个见解:您对 string.Format() 的使用表明您可能习惯于使用它将参数数据替换为查询。 这太不安全了! 它会导致 Sql Injection 漏洞。您需要改用参数化查询。了解他们。使用它们。如果您已经知道这一点并且我对此阅读过多,请忽略,否则请理解这是非常重要的。
-
我认为您使用解决方案更新了您的问题,因此很难判断您做错了什么。如果其他人碰巧有同样的问题,他们将无法识别它。我建议不要使用解决方案更新问题中的代码。有点违背了整个目的。
标签: c# sql sql-server sqldatareader