SqlDataReader没有数据时读取的尝试无效

时间:2016-12-29 15:12:18

标签: c# sqldatareader

这是我的代码

    public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }
    SqlConnection con = new SqlConnection(@"Data Source=.;Initial Catalog=DayanaP;Integrated Security=True");

    private void button1_Click(object sender, EventArgs e)
    {
        con.Open();
        SqlCommand test = new SqlCommand("select * from maindata where userid='"+textBox1.Text+ "' and password='" + textBox2.Text + "' ", con);
        SqlDataReader dr = test.ExecuteReader();
        int count = 0;
        while (dr.Read())
        {
            count++;
        }
        if (count == 1)
            MessageBox.Show(dr.GetString(0));
        else
        {
            MessageBox.Show("123");
        }

        con.Close();
    }
}

}

这是我在代码中使用的数据库维护 enter image description here

当我输入名称和密码时,我希望看到显示用户名字的消息框 机器人我得到这个错误:

An unhandled exception of type 'System.InvalidOperationException' 
occurred in System.Data.dll
Additional information: Invalid attempt to read when no data is present.

请帮我解决此问题

3 个答案:

答案 0 :(得分:2)

您已经使用了阅读器

    while (dr.Read())
    {
        count++;
    }
    //dr is now empty
    if (count == 1)
        MessageBox.Show(dr.GetString(0));

这就是你需要的

    while (dr.Read())
    {
        count++;
        if (count == 1)
            MessageBox.Show(dr.GetString(0));
    }

或更短

    if (dr.Read())
    {
        MessageBox.Show(dr.GetString(0));
    }
    else
    {
        MessageBox.Show("123");
    }

    string rdrZero = "123";
    if (dr.Read())
    {
        rdrZero = GetString(0));
    }
    MessageBox.Show(rdrZero);

答案 1 :(得分:1)

如果有的话,

dr.Read()会读取下一个可用行。如果没有其他行,dr.Read()会返回false

所以在你的代码中:

 while (dr.Read())
 {
      count++;
 }

您致电dr.Read()直到它返回false,这意味着无需再阅读
因此,在所有内容都已阅读后,您就会显示dr.GetString(0)的来电。

一个解决方案可能如下所示:

string s = null;
if (dr.Read()) s = dr.GetString(0);
if (string.IsNullOrEmpty(s) || dr.Read())
    MessageBox.Show("123");
else
    MessageBox.Show(s);

这与(我猜)您的代码要做的相同:如果结果集中只有一行,则显示返回的字符串。

但您的代码中存在更多问题:

  1. 不要将用户输入直接插入您的查询!您的代码向SQL Injection开放。请使用参数化查询。
  2. 我建议您明确命名要获取的列,而不是SELECT *。你怎么知道第0列是你想要的字符串?
  3. 由于您只需要名字,因此最好使用SELECT firstname...并使用ExecuteScalar()代替ExecuteReader()。但是,您可能希望以后在项目中添加更多列。

答案 2 :(得分:1)

您应首先检查datareader是否包含此示例的行。您还需要确保从while块中的datareader中检索值。

 var value = string.empty;
 if(dr.HasRows)
 {    
     while (dr.Read())
     {
        count++;
        value = dr.GetString(0);
     }    
 }