DataReader为null或为空

Gop*_*pal 1 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"; 
}
Run Code Online (Sandbox Code Playgroud)

上面的代码给了我这个错误:

异常详细信息:System.IndexOutOfRangeException:Additional

任何帮助将不胜感激...

Dav*_*vid 9

我在这里看到一些问题......首先,看起来你正试图访问该行中的表名:

if(dr1["tb_car"] != DBNull.Value
Run Code Online (Sandbox Code Playgroud)

您应该传递FIELD NAME而不是表名.因此,如果名为"tb_car"的表有一个名为CarId的字段,您可能希望代码看起来像:

if(dr1["CarId"] != DBNull.Value)
Run Code Online (Sandbox Code Playgroud)

如果我是对的,那么可能没有名为"tb_car"的字段,并且索引超出范围错误是因为DataReader正在查找名为"tb_car"的列集合中的项目而未找到它.这几乎就是错误的含义.

其次,在你甚至可以检查它之前,你必须首先调用DataReader的Read()命令来从数据库中读取一行.

所以你的代码真的应该像......

while(dr.Read())
{
   if(dr1["CarId"] != DBNull.Value)
   {
      ....
Run Code Online (Sandbox Code Playgroud)

等等.

请参阅此处以正确使用DataReader:http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqldatareader.read.aspx


最后,如果您只是检查表中是否有任何行,则可以忽略上述所有行并使用HasRows属性,如

if(dr.HasRows)
{
   ....
Run Code Online (Sandbox Code Playgroud)

虽然如果你正在使用while(dr.Read())语法,while循环中的代码只会在第一个地方有行时执行,所以如果你不想做任何没有结果的事情,那么HasRows可能是不必要的.如果你想返回"没有找到结果"这样的消息,你仍然想要使用它,当然..

编辑 - 添加

我认为线路也存在问题

if(dr1["CarId"] != DBNull.Value)
Run Code Online (Sandbox Code Playgroud)

你应该使用DataReader的IsDbNull()方法.如在

if(dr.IsDbNull("CarId"))
Run Code Online (Sandbox Code Playgroud)

对不起,我第一次错过了.