DataReader为null或为空

时间:2010-08-08 03:43:51

标签: c#

使用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

非常感谢任何帮助......

2 个答案:

答案 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
}