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

Posted

技术标签:

【中文标题】不存在数据时尝试读取无效【英文标题】:Invalid attempt to read when no data is present 【发布时间】:2010-11-11 23:14:04 【问题描述】:
    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 抛出异常:

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

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

【问题讨论】:

【参考方案1】:

您必须调用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

【讨论】:

除此之外,您可能还想尝试使用 dr.IsBDNull(0) 将数据设为空 "You have to call DataReader.Read to fetch the result:" 我一看到,立刻就说:“哦!是啊!我没有调用 .Read()”。你知道,我已经这样做了 35 年。你会认为............大声笑【参考方案2】:

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

【讨论】:

【参考方案3】:

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

【讨论】:

【参考方案4】:

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

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

   ...

【讨论】:

在我的情况下,我有这个,虽然我一直在其他地方使用它,但在这个产生这个错误的特定场景中,这并没有阻止错误冒泡。我的查询结果有行,但阅读器没有数据。我真的不明白发生了什么。自己验证了查询和参数。【参考方案5】:

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

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

String To=email;

【讨论】:

【参考方案6】:

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

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

解决了问题

【讨论】:

以上是关于不存在数据时尝试读取无效的主要内容,如果未能解决你的问题,请参考以下文章

在查询结果上启动 foreach 循环时出现“不存在数据时尝试读取无效”

使用 readxl 时出错:“exdir”不存在

Visual Studio Profiling .psess 不存在或无效

尝试从两个数据库中读取以检查帐户是不是存在

无效操作:关系“information_schema.sequences”不存在(SpringBoot + RedShift)

如何测试 Tabris 中是不是存在文件?