【发布时间】: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()之后访问retrieve。Read()语句返回一个bool指示是否读取了数据(false如果没有要读取的结果) -
我怀疑retrieve["Card'] 的值为null 或not null,但绝不是DbNull.Value。
-
也.. 回到基础。使用你的调试器,在它失败之前设置一个断点,如果可以的话,使用即时窗口玩它。
-
你的实际查询是什么,它返回
NULL,多少行?如果它只是一行一列,那么您可能想要ExecuteScalar
标签: c# visual-studio sqldatareader