【问题标题】:SqlDataReader can only check for one of (Null or non null value)SqlDataReader 只能检查(Null 或非 null 值)之一
【发布时间】:2021-04-14 22:36:46
【问题描述】:

我正在编写一个程序(供个人使用),将卡片名称存储到数据库中。我想实现一种方法来查看名称是否已经存在,如果存在,它将进入“Do_have_in_db_listbox”,否则它将进入“do_not_have_list_box”。这是我这样做的原始方法:

 while (retrieve.Read())
        {
            if(retrieve["Card"] != DBNull.Value)
            {
                listBox_haveInDB.Items.Add(word_for_query);
            }
            else if (retrieve["Card"] == DBNull.Value)
            {
                listBox_notINDb.Items.Add(word_for_query);
            }
        }

我在没有 While 循环的情况下尝试过这个,我尝试过 if、else、else if 和条件的变体。但无论出于何种原因,无论第一个条件是什么,else 语句都不会执行。我一直在寻找并尝试解决问题,但唯一对我有用的是异常处理程序:

retrieve.Read();
try
          {
              if(retrieve["Card"] != DBNull.Value)
              {
                  listBox_haveInDB.Items.Add(word_for_query);
              }
          }
          catch
          {
              listBox_notINDb.Items.Add(word_for_query);
          }

这是我绕过它的方式。我做错了什么?

【问题讨论】:

  • 如果遇到异常,请查看异常。
  • 假设您每张卡有一行 - 您的 select 语句是否可能只返回一个空的结果列表,这就是为什么您不能在 Read() 之后访问 retrieveRead() 语句返回一个 bool 指示是否读取了数据(false 如果没有要读取的结果)
  • 我怀疑retrieve["Card'] 的值为null 或not null,但绝不是DbNull.Value。
  • 也.. 回到基础。使用你的调试器,在它失败之前设置一个断点,如果可以的话,使用即时窗口玩它。
  • 你的实际查询是什么,它返回NULL,多少行?如果它只是一行一列,那么您可能想要ExecuteScalar

标签: c# visual-studio sqldatareader


【解决方案1】:

要评估数据库字段以确定它们的值是否为 DBNull,您可以将字段值传递给 DBNull.Value.Equals 方法。但是,这种方法很少使用。

 DBNull.Value.Equals(retrieve["Card"] )

尝试使用这种语法。这是最可靠的方法:

if (!reader.IsDBNull( reader.GetOrdinal("Card")))
{
  listBox_haveInDB.Items.Add( ...your code
}

或者你也可以使用索引

if (!reader.IsDBNull( column_index )

【讨论】:

    【解决方案2】:

    Card 是数据表中的字段吗?如果数据表中有任何数据,retrieve["Card"] 永远不会为空。

    我想实现一种方法来查看名称是否已经存在

    如果要检查数据表中是否存在word_for_query,则需要将retrieve["Card"].ToString()word_for_query进行比较,而不是DBNull.Value

    SqlDataReader retrieve = cmd.ExecuteReader();
    try
    {
        while (retrieve.Read())
        {
            if (retrieve["Card"].ToString() == word_for_query)
            {
                // if exists, show in listBox_haveInDB and return
                listBox_haveInDB.Items.Add(word_for_query);
                return;
            }
        }
        // not exists
        listBox_notINDb.Items.Add(word_for_query);
    }
    catch (Exception ex)
    {
        Console.WriteLine("\nError:\n{0}", ex.Message);
    }
    finally
    {
        retrieve.Close();
    }
    

    【讨论】:

      猜你喜欢
      • 2021-02-19
      • 2012-10-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-18
      相关资源
      最近更新 更多