【问题标题】:DataReader is null or emptyDataReader 为 null 或为空
【发布时间】:2010-08-08 03:43:50
【问题描述】:

使用 C#

我有一个数据读取器,它从 mysql 数据库返回 lsit 记录。

我正在尝试编写检查数据读取器是否为空的代码。这背后的逻辑是:如果数据读取器有字段,则显示信息,否则隐藏字段。

我试过了:

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:附加

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

【问题讨论】:

  • ps。您的代码中存在巨大的安全漏洞,因为您没有使用参数。如果我输入“';从 tb_car 中删除 *;”进入您的文本字段,您将丢失所有记录!哦? =)
  • 伙计,我没听懂。 @Gopal - 他是对的。请务必阅读此内容:aspnet101.com/2007/03/parameterized-queries-in-asp-net

标签: c#


【解决方案1】:

我在这里看到了一些问题...首先,您似乎正在尝试访问该行中的表名:

if(dr1["tb_car"] != DBNull.Value

您应该传递一个字段名而不是表名。因此,如果名为“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


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

if(dr.HasRows)
{
   ....

虽然如果您使用while(dr.Read()) 语法,while 循环中的代码将仅在首先存在行时才会执行,因此如果您不想执行任何操作,则可能不需要 HasRows没有结果。当然,如果您想返回诸如“未找到结果”之类的消息,您仍然希望使用它..

编辑 - 添加

我觉得这条线也有问题

if(dr1["CarId"] != DBNull.Value)

您应该使用 if DataReader 的 IsDbNull() 方法。如

if(dr.IsDbNull("CarId"))

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

【讨论】:

    【解决方案2】:

    在尝试读取值之前,使用 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
    }
    

    【讨论】:

    • +1。这是一个很好的答案,但我相信它只能解决部分问题。
    猜你喜欢
    • 2016-11-30
    • 2022-10-15
    • 1970-01-01
    • 2017-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-25
    • 2013-11-26
    相关资源
    最近更新 更多