使用C#
我有一个datareader,可以从mysql数据库中返回lsit记录。
我正在尝试编写检查datareader是否为空的代码。这背后的逻辑是:如果datareader有字段然后显示信息,否则隐藏字段。
我试过了:
cmd1 = new OdbcCommand("Select * from tb_car where vehicleno = '" + textbox2.text + "';", dbcon);
dr1 = cmd1.ExecuteReader();
if (dr1["tb_car"]. != DBNull.Value)
{
textbox1.Text = "contains data";
}
else
{
textbox1.Text = "is null";
}
上面的代码给了我这个错误:
异常详细信息:System.IndexOutOfRangeException:Additional
非常感谢任何帮助......
答案 0 :(得分:9)
我在这里看到一些问题......首先,看起来你正试图访问该行中的表名:
if(dr1["tb_car"] != DBNull.Value
您应该传递FIELD NAME而不是表名。因此,如果名为“tb_car”的表有一个名为CarId的字段,您可能希望代码看起来像:
if(dr1["CarId"] != DBNull.Value)
如果我是对的,那么可能没有名为“tb_car”的字段,并且索引超出范围错误是因为DataReader正在查找名为“tb_car”的列集合中的项目而未找到它。这几乎就是错误的含义。
其次,在你甚至可以检查之前,你必须首先调用DataReader的Read()命令来从数据库中读取一行。
所以你的代码真的应该像......
while(dr.Read())
{
if(dr1["CarId"] != DBNull.Value)
{
....
等等。
请参阅此处以正确使用DataReader:http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqldatareader.read.aspx
最后,如果您只是检查表中是否有任何行,您可以忽略上述所有内容并使用{/ 3}}属性,如
if(dr.HasRows)
{
....
虽然如果你使用while(dr.Read())
语法,while循环中的代码只会在第一个地方有行时执行,所以如果你不想做的话,HasRows可能是不必要的什么都没有结果。如果你想要回复“没有找到结果”这样的消息,你仍然想要使用它。
修改 - 添加
我认为行
也存在问题if(dr1["CarId"] != DBNull.Value)
您应该使用DataReader的HasRows方法。如在
if(dr.IsDbNull("CarId"))
对不起,我第一次错过了。
答案 1 :(得分:3)
在尝试读取值之前,使用dr1.Read()检查是否有行。 Read最初获取第一行,然后返回后续行,如果行可用或为空/结束,则返回true。
例如
// for reading one row
if (rd1.Read())
{
// do something with first row
}
// for reading thru multiple rows
while (rd1.Read())
{
// do something with current row
}