2009-12-10 43 views
1

我正在从C#中的SQL数据读取器读取数据,并将列中的值传递给下拉列表。有两列正在阅读。使用IsDbNull,我能够处理空值。然而,正如我现在写的代码,如果dr.GetString(0)为null,根本没有值传递,只要dr.GetString(1)(或两者都不为null),所有的值传递并且空值被忽略。以下是我对,而DataReader的是阅读:Sql 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()); 
    } 
} 

我需要发生的事情是为下拉列表与任何值DataReader的回报,无论他们是在专栏中,我已经删除的填充。使用和try/catch语句来清理代码。感谢大家。

+2

你的问题是什么? – Stu 2009-12-10 18:34:10

+0

对不起。澄清了我的代码的意图。 – 2009-12-10 18:43:37

回答

6

我的读者处理空值首选的方法是使用指定的列,然后使用Convert.ToString(对象)

所以,你具备以下条件:

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

我不知道我理解你的问题。
你说

然而,正如我的代码编写 现在,如果dr.GetString(0)为空, 没有值沿全部通过, 而只要仅dr.GetString (1) (或两者皆为)为空,则将传递所有值 值,并忽略空值 值。

这听起来像你使用的if/else if,但是你的代码显示了两条if语句。

编辑:

为了更好的解决您的更新问题,我的解决办法是有listItems中的一个通用的列表和每列添加到列表中。然后,将该列表绑定到下拉列表中:

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; 

这样,如果您没有数据,项目将为空。如果一行中有一列,下一行中有另一列,它会适当地添加它们。尽管如果你拿出其他的东西,你的代码应该是一样的。

+1

附注:为了表示其他可为空的值,可以使用(为存在)可为空的或int ?.诠释?是编写Nullable 的简写方式,那么您可以使用HasValue属性检查两个值是否为空。 – 2009-12-10 18:37:08

+1

甚至更​​容易=>!string.IsNullOrEmpty(dr [“FIRST_ITEM”]。ToString()) – ryanulit 2009-12-10 18:37:42

+1

@ryanulit:不会失败,如果列不存在?我很确定(但我可能错了),如果列上的索引器失败,Convert.ToString()方法不会抛出异常。 – 2009-12-10 18:43:36