【问题标题】: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”语句是否正确。以及如何修复错误?

【问题讨论】:

    标签: c# ado.net sqldatareader


    【解决方案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()
           }
          

          解决了问题

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多