不存在数据时尝试读取无效
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 循环时出现“不存在数据时尝试读取无效”
Visual Studio Profiling .psess 不存在或无效
无效操作:关系“information_schema.sequences”不存在(SpringBoot + RedShift)