2014-01-10 5 views
2

Я пытаюсь заполнить combobox со списком, который возвращает мой запрос. Когда я выполняю свою программу, это дает мне заданный прилив недействительной ошибки (я выполняю это при событии загрузки страницы). Каждое поле в базе данных, с которой я должен работать, может быть нулевым, кроме первичного ключа. Поэтому я попытался использовать DBNull.Value, но он не может заставить мои поля (int) считывателя работать. Я поставил свой код ниже для лучшего понимания. Как я могу заставить читателя (int) работать с моими инструкциями, чтобы они могли читать, когда есть нулевое значение?Как вернуть нулевое значение из базы данных

CustData cd = new CustData(); 
cd.CustomerID = (int)reader["CustomerID"]; 
cd.Name = reader["Name"] != DBNull.Value ? reader["Name"].ToString() : string.Empty; 
cd.ShippingAddress = reader["ShippingAddress"] != DBNull.Value ? reader["ShippingAddress"].ToString() : string.Empty; 
cd.ShippingCity = reader["ShippingCity"] != DBNull.Value ? reader["ShippingCity"].ToString() : string.Empty; 
cd.ShippingState = reader["ShippingState"] != DBNull.Value ? reader["ShippingState"].ToString() : string.Empty; 
cd.ShippingZip = (int)reader["ShippingZip"]; 
cd.BillingAddress = reader["BillingAddress"] != DBNull.Value ? reader["BillingAddress"].ToString() : string.Empty; 
cd.BillingCity = reader["BillingCity"] != DBNull.Value ? reader["BillingCity"].ToString() : string.Empty; 
cd.BillingState = reader["BillingState"] != DBNull.Value ? reader["BillingState"].ToString() : string.Empty; 
cd.BillingZip = (int)reader["BillingZip"]; 
cd.Territory = reader["Territory"] != DBNull.Value ? reader["Territory"].ToString() : string.Empty; 
cd.Category = reader["Category"] != DBNull.Value ? reader["Category"].ToString() : string.Emptyy 
+1

Не можете ли вы просто проверить «" вместо DBNUll.Value? – DatRid

ответ

5

Это потому, что int не обнуляемая. Вам нужно использовать int? или nullable<int> (длинная рука), чтобы он мог быть int ИЛИ нулевым значением.

Затем вы можете использовать обычные .HasValue и .Value и т. Д., Чтобы получить значение от товара.

EDIT: Чтобы улучшить видимость моего комментария к этому ответу. Я бы посоветовал не проверять NULL и хранить Zero в вашем свойстве, потому что тогда, когда вы сохраняете назад, вы меняете нуль на нуль, хотя система ничего не изменила. Теперь отчеты и т. Д. Могут различать NULL и Zero (очень часто) и могут начинать делать странные вещи!

Null НЕ равен нулю! Если вы предполагаете, что это работает как работа ... Что произойдет, если я действительно хочу записать нуль? Как вы проводите различие между реальным нулем и трюком «был нулевой нулевой»? Правильно, спаси себя от боли!

+1

Я попробовал (int?) Читатель, и он говорит, что может отличать его от int до int? –

+0

Нет, 'int?' НЕ является 'int', потому что он может содержать нули. Вам нужно решить, хотите ли вы, чтобы ваша переменная в коде содержала нуль, как база данных, или ноль, если ничего не было указано. Однако будьте осторожны при хранении нуля (или какого-либо другого значения), потому что тогда, когда вы будете писать обратно в базу данных, он больше не будет хранить нуль, но ноль! Итак, лучше всего изменить вашу собственность как 'int?', А не 'int', и таким образом она соответствует базе данных поддержки. Подводя итог: Null НЕ равен нулю! – Belogix

+0

Да, я получил его сейчас, спасибо за помощь! –

2

Использования обнуляемого INT, или просто сделать контроль за ИНТ слишком

reader["ShippingZip"] != DBNull.Value ? (int)reader["ShippingZip"] : default(int); 
+0

Опасно, что он будет хранить нуль в переменной ... Теперь пользователь нажимает «Сохранить» для аргументов, не меняя ничего, и теперь база данных записывает ноль. Что это значит в отчетах или в системе в целом? Null не равен нулю. – Belogix

+0

@Belogix, технически вы правы. Но как бы опасно повлиять на его записи? Если значение равно null, это означает, что в этом столбце нет записи. 0 не означает ничего здесь. 0 или нулевое значение не имеет значения. –

+0

Не совсем ... Они ОЧЕНЬ разные вещи! Простым примером может быть необязательный поле, которое, если оно заполнено, применяет какую-то логику где-то (я видел это МНОГИЕ времена в отчетах и ​​т. Д.). Итак, если у вас есть NULL, обработка не производится, если она равна нулю, то это значение, и поэтому выполняется дополнительная логика. Таким образом, изменив его на Zero, вы теперь вынуждены что-то менять, хотя система явно не задала его!Теперь, скажем, я хочу записать ноль, потому что это что-то значит в моем мире ... Упс! Теперь, которое равно нулю и которое равно нулю ?! Теперь вы в страшном мире! – Belogix

1

Вы должны использовать обнуляемый Int для ваших переменного и бросьте, как (int?). Int может иметь только значение; nullable типы также могут быть нулевыми. Когда вы используете нулевой тип, вы можете посмотреть свойство .HasValue. Вот страница MSDN: http://msdn.microsoft.com/en-us/library/2cf62fcy.aspx

+0

Ваше предложение было в линии также, так что спасибо. –

Смежные вопросы