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

问题描述 投票:0回答:6
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”语句是否正确。我该如何修复该错误?

c# ado.net sqldatareader
6个回答
221
投票

您必须调用

DataReader.Read()
来获取结果:

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

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

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

17
投票

在尝试读取任何数据之前,您必须调用

dr.Read()
。如果没有任何内容可读取,该方法将返回 false。


9
投票

我刚刚遇到了这个错误,我正在调用

dr.NextResult()
而不是
dr.Read()


8
投票

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

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

3
投票

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

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

String To=email;

3
投票

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

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

解决了问题

© www.soinside.com 2019 - 2024. All rights reserved.