没有数据时无效尝试读取

kno*_*ter 72 c# ado.net

    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;
    }
Run Code Online (Sandbox Code Playgroud)

当我调试到第7行时,没关系,但之后dr会抛出异常: Invalid attempt to read when no data is present. 这是不可能的,因为我在表中有user = sumant的数据.请告诉我"if"声明是否正确.........

我该如何删除错误?

Jul*_*lin 162

你必须打电话DataReader.Read来获取结果:

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

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

while (dr.Read()) 
{
    // read data for each record here
}
Run Code Online (Sandbox Code Playgroud)

  • 除此之外,您可能希望使用dr.IsBDNull(0)尝试将数据设为null (4认同)

Col*_*kay 17

您必须dr.Read()在尝试读取任何数据之前调用.如果没有什么可读的,那个方法将返回false.


Cha*_*lie 9

我刚才有这个错误,我打电话给dr.NextResult()而不是dr.Read().


小智 8

我会检查SqlDataReader是否先返回行:

SqlDataReader dr = cmd10.ExecuteReader();
if (dr.HasRows)
{
   ...
}
Run Code Online (Sandbox Code Playgroud)

  • 就我而言,我有这个,尽管我一直在其他地方使用它,但在产生此错误的特定场景中,这并没有阻止错误冒泡。我的查询结果有行,但读取器没有数据。我真的不明白这是怎么回事。自己验证了查询和参数。 (4认同)