101
    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抛出异常:

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

我不明白为什么会出现该异常,因为表中确实有用户名 = sumant 的数据。

请告诉我'if'语句是否正确。以及如何修复错误?

4

6 回答 6

203

您必须调用DataReader.Read以获取结果:

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

DataReader.Read()返回一个bool指示是否有更多数据块要读取,所以如果你有超过 1 个结果,你可以这样做:

while (dr.Read()) 
{
    // read data for each record here
}
于 2009-07-18T14:08:50.767 回答
17

dr.Read()在尝试读取任何数据之前,您必须先打电话。如果没有可读取的内容,该方法将返回 false。

于 2009-07-18T14:08:39.537 回答
9

我刚刚遇到这个错误,我打电话dr.NextResult()而不是dr.Read().

于 2014-04-27T02:38:07.793 回答
8

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

SqlDataReader dr = cmd10.ExecuteReader();
if (dr.HasRows)
{
   ...
}
于 2013-05-27T13:41:07.110 回答
3

我使用了下面的代码,它对我有用。

String email="";
    SqlDataReader reader=cmd.ExecuteReader();
    if(reader.Read()){
        email=reader["Email"].ToString();
    }

String To=email;
于 2016-04-23T18:37:27.090 回答
2

我有 2 个可能包含空值的值。

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

解决了这个问题

于 2016-08-18T10:41:24.423 回答