无效的尝试在没有数据的情况下读取

111
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'语句是否正确,以及如何修复这个错误?

6个回答

221
您需要调用 DataReader.Read() 来获取结果:
SqlDataReader dr = cmd10.ExecuteReader();
if (dr.Read()) 
{
    // read data for single/first record here
}

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

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

4
除此之外,你可能想尝试使用dr.IsBDNull(0)来检查数据是否为空。 - Luis Robles
5
你需要调用DataReader.Read来获取结果: - KWallace

18

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


10

我刚刚遇到了这个错误,我调用了dr.NextResult()而不是dr.Read()


8

我建议先检查SqlDataReader是否有返回行:

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

5
就我的情况而言,我曾经遇到过这种情况,虽然我在其他地方使用过它,但在这种特定的情况下,这并没有阻止错误继续出现。我的查询结果有行,但读取器却没有数据。我真的不明白发生了什么。我已经自己验证了查询和参数。 - Barry

3

我有两个值可能包含空值。

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

解决了问题。

3
我使用下面的代码,它对我有效。
String email="";
    SqlDataReader reader=cmd.ExecuteReader();
    if(reader.Read()){
        email=reader["Email"].ToString();
    }

String To=email;

这如何解决OP的问题?你有全新的代码;他们应该把它放在哪里,替换什么?没有解释的代码块很少对读者有用。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接