1

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

不存在数据时尝试读取无效。

这是我的代码。

 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);
              }
         }
    } 
}
4

2 回答 2

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();
        }
    }
}
.....
于 2012-11-29T21:51:25.477 回答
3

我在尝试获取我知道的 GUID 时遇到了类似的问题 - 我可以直接在 SQL Management Studio 中运行相同的 SQL 并获得我的结果。因此,我没有尝试将其作为 GUID 带回(它保存在 char(35) 字段中,即使它确实是 GUID!),我将其作为字符串带回,而是:

        SqlConnection sqlConn = null;
        string projId = String.Empty;
        string queryString = "SELECT * FROM project WHERE project_name='My Project'";

        try
        {
            sqlConn = new SqlConnection(connString);
            SqlCommand cmd = new SqlCommand(queryString, sqlConn);
            sqlConn.Open();

            SqlDataReader reader = cmd.ExecuteReader();
            if (reader.HasRows)
            {
                while (reader.Read())
                {
                    projId = reader.GetSqlValue(0).ToString();   // <-- safest way I found to get the first column's parameter -- increment the index if it is another column in your result
                }                    
            }
            reader.Close();
            sqlConn.Close();
            return projId;                
        }
        catch (SqlException ex)
        {                
            // handle error
            return projId;
        }
        catch (Exception ex)
        {
            // handle error
            return projId;
        }
        finally
        {
            sqlConn.Close();
        }
于 2015-09-09T23:20:00.650 回答