没有数据时读取尝试无效


80
    private void button1_Click(object sender, EventArgs e)
    {
        string name;
        name = textBox5.Text;
        SqlConnection con10 = new SqlConnection("con strn");
        SqlCommand cmd10 = new SqlCommand("select * from sumant where username=@name");
        cmd10.Parameters.AddWithValue("@name",name);
        cmd10.Connection = con10;
        cmd10.Connection.Open();//line 7
        SqlDataReader dr = cmd10.ExecuteReader();
    }

    if ( textBox2.Text == dr[2].ToString())
    {
        //do something;
    }

当我调试到第7行时,还可以,但是在那之后dr抛出异常: Invalid attempt to read when no data is present. 这是不可能的,因为我的表中确实有用户名= sumant的数据。请告诉我'if'陈述是否正确.........

以及如何删除错误?

Answers:


175

您必须致电DataReader.Read以获取结果:

SqlDataReader dr = cmd10.ExecuteReader();
if (dr.Read()) 
{
    // read data for first record here
}

DataReader.Read()返回一个bool指示,指示是否还有更多的数据块要读取,因此,如果您有多个结果,则可以执行以下操作:

while (dr.Read()) 
{
    // read data for each record here
}

4
除此之外,您可能希望使用dr.IsBDNull(0)
Luis Robles

可以改善此答案,第一个代码片段无需考虑的返回值dr.Read()。因此,如果查询不返回记录,则错误是相同的:“在不存在数据的情况下无效的读取尝试”。而是使用if(dr.Read()){....}(或如下所示的循环)。
蒂姆·施密特2014年

17

您必须先致电dr.Read()才能尝试读取任何数据。如果没有要读取的内容,该方法将返回false。


9

我只是遇到了此错误,我打电话给dr.NextResult()而不是dr.Read()


1
只是完全一样的东西!那是一个令人沮丧的时刻!
JonnyRaa 2014年

8

我将检查SqlDataReader是否首先返回行:

SqlDataReader dr = cmd10.ExecuteReader();
if (dr.HasRows)
{
   ...
}

4
就我而言,我有这个问题,尽管我一直在其他地方使用它,但是在产生此错误的特定情况下,这并不能阻止错误起泡。我的查询结果有行,但阅读器没有数据。我真的不明白发生了什么。我自己验证了查询和参数。
巴里


2

我当时有2个值,其中可能包含空值。

while(dr.Read())
 {
    Id = dr["Id"] as int? ?? default(int?);
    Alt =  dr["Alt"].ToString() as string ?? default(string);
    Name = dr["Name"].ToString()
 }

解决了问题

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.