2009-12-10 3 views
1

Я читаю из SQL-сервера данных в C# и передаю значения из столбцов в раскрывающийся список. Прочитаны два столбца. Используя IsDbNull, я могу обрабатывать нулевые значения. Однако, поскольку у меня есть код, написанный прямо сейчас, если dr.GetString (0) равно null, никакие значения не передаются вообще, пока только dr.GetString (1) (или ни один) не равен нулю, все значения передаются вдоль и нулевые значения игнорируются. Вот что я имею в то время как DataReader читает:Sql Datareader null values ​​

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()); 
    } 
} 

Что мне нужно, так это для DropDownList заселяться с тем, что значения возвращается DataReader, независимо от того, какой столбец они находятся в я удалил. операторы использования и try/catch, чтобы декларировать код. Всем спасибо.

+2

Что вы хотите сказать? – Stu

+0

Извините. Уточнено намерение моего кода. –

ответ

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.

Edit:

Чтобы лучше рассмотреть обновленный вопрос, мое решение будет иметь общий список 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; 

Таким образом, если у вас нет данных, элементы будут пустыми. Если у вас есть один столбец в одной строке, а другой столбец в следующей строке, он добавит их соответствующим образом. Хотя, ваш код должен работать так же, если вы вытащили else.

+1

В качестве примечания стороны: для представления других значений с нулевым значением вы можете использовать (для существования) Nullable или int ?. Int? является сокращенным способом написания Nullable , тогда вы можете проверить два, не имеет ли значение null свойство HasValue. –

+1

И еще проще =>! String.IsNullOrEmpty (dr ["FIRST_ITEM"]. ToString()) – ryanulit

+1

@ryanulit: не произойдет, если столбец не существует? Я уверен (но я мог ошибаться), что метод Convert.ToString() не будет генерировать исключение, если индексщик в столбце терпит неудачу. –