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会抛出异常:
Invalid attempt to read when no data is present.
这是不可能的,因为我在表中有user = sumant的数据。
请告诉我“if”陈述是否正确.........
如何删除错误??
答案 0 :(得分:157)
您必须致电DataReader.Read
以获取结果:
SqlDataReader dr = cmd10.ExecuteReader();
if (dr.Read())
{
// read data for first record here
}
DataReader.Read()
返回bool
,表示是否有更多数据块要读取,因此如果您有多于1个结果,则可以执行以下操作:
while (dr.Read())
{
// read data for each record here
}
答案 1 :(得分:16)
在尝试读取任何数据之前,您必须致电dr.Read()
。如果没有什么可读的,那么该方法将返回false。
答案 2 :(得分:9)
我刚刚遇到此错误,我正在调用dr.NextResult()
而不是dr.Read()
。
答案 3 :(得分:8)
我会检查SqlDataReader是否先返回行:
SqlDataReader dr = cmd10.ExecuteReader();
if (dr.HasRows)
{
...
}
答案 4 :(得分:3)
我使用下面的代码,它对我有用。
String email="";
SqlDataReader reader=cmd.ExecuteReader();
if(reader.Read()){
email=reader["Email"].ToString();
}
String To=email;
答案 5 :(得分:1)
我有2个可能包含空值的值。
while(dr.Read())
{
Id = dr["Id"] as int? ?? default(int?);
Alt = dr["Alt"].ToString() as string ?? default(string);
Name = dr["Name"].ToString()
}
解决了问题