Sql Datareader为null值

Geo*_*Ego 1 c# sql null if-statement datareader

我正在从C#中的SQL datareader读取并将列中的值传递给下拉列表.正在读取两列.使用IsDbNull,我能够处理空值.但是,由于我现在编写了代码,如果dr.GetString(0)为null,则根本不会传递任何值,而只要dr.GetString(1)(或两者都不是)为null,所有的传递值并忽略空值.以下是datareader读取时的内容:

while (dr.Read())
{
     if (!dr.IsDBNull(0))
     {
          machineName.Items.Add(dr.GetString(0).ToString());
     }
     else if (!dr.IsDBNull(1))
     {
          machineName.Items.Add(dr.GetString(1).ToString());
     }
 }
Run Code Online (Sandbox Code Playgroud)

我需要做的是使用datareader返回的任何值填充dropdownlist,无论它们位于哪个列.我已经删除了using和try/catch语句以便对代码进行整理.感谢大家.

Jim*_*ert 6

我在阅读器中处理空值的首选方法是使用命名列然后使用Convert.ToString(object)

所以,你有以下几点:

while (dr.Read())
{
     string firstItem = Convert.ToString(dr["FIRST_ITEM"]);
     if(!string.IsNullOrEmpty(firstItem))
     {
        machineName.Items.Add(firstItem);
     }
     ... etc.
}
Run Code Online (Sandbox Code Playgroud)

不过,我不确定我理解你的问题.
你说

但是,由于我现在编写了代码,如果dr.GetString(0)为null,则根本不会传递任何值,而只要dr.GetString(1)(或两者都不是)为null,所有的传递值并忽略空值.

这听起来像你正在使用if/else if,但是你的代码显示了两个if语句.

编辑:

为了更好地解决您更新的问题,我的解决方案是拥有ListItem的通用列表,并将每列添加到该列表中.然后,将该列表绑定到下拉列表:

List<ListItem> items = new List<ListItem>();

while(dr.Read())
{
    string firstItem = Convert.ToString(dr["FIRST_ITEM"]);
    if(!string.IsNullOrEmpty(firstItem))
    {
        ListItem thisItem = new ListItem(firstItem, firstItem);
        items.Add(thisItem);
    }
}

 machineName.Items = items;
Run Code Online (Sandbox Code Playgroud)

这样,如果您没有数据,则项目将为null.如果一行中有一列而下一行中有另一列,则会适当地添加它们.虽然,如果你拿出其他代码,你的代码应该是一样的.