2009-12-04 2 views
1

может быть вопросом для детей, бидди, ноint? C#, используется в ref, что именно это

Я пытался передать параметр «output» в хранимую процедуру с помощью C Sharp и получал ошибку, пока не прошел «выход» переменной, используя следующий синтаксис:

int? ROWID = 0; 
ADAPTER.INSERT(val1, val2, ref ROWID); 

проблема Хотя решается, я просто не могу понять, почему, когда я пытаюсь удерживать значение в нормальном «ИНТ», возвращенного хранимая процедура дает преобразование ошибка

int result = ROWID; // not correct 

Итак, что я должен сделать:

int result = (int)ROWID; // correct 

Что именно означает «int?» имею в виду?

ответ

9

int? является обнуляемым int. Прочитано Using Nullable Types (C# Programming Guide).

Кстати, если вы не прочитали весь путеводитель, по крайней мере, проверьте свойства HasValue и Value в своей переменной ROWID.

+0

+1 для точного (по крайней мере, сейчас) ссылки. –

2

int? - целое число, равное нулю. Для получения дополнительной информации см. Страницу MSDN на странице Nullable Types.

5

int? является nullable int (system.nullable), он может принимать значение null.

Лучший способ для преобразования является нулевым значением сливаться:

int result = rowid ?? 0; 
+3

"Лучший"? Не всегда. Иногда это безопасно, но в других случаях лучше обрабатывать NULL и 0 по-разному. –

+0

Я бы сказал, что это лучший, но часто коллциссинг для значения, такого как -1 или int.max, лучше, но это все равно то же самое решение. –

7

Int? совпадает с Nullable<int> и означает, что это значение может быть целым числом или значением null.

Возможно, это связано с тем, что в столбце базы данных установлено значение NULL, а не NOT NULL. Если в вашей базе данных могут быть нулевые значения, ваш код будет сбой при исключении. Если в базе данных не может быть нулей, вы должны изменить определение схемы для этого столбца, а не NOT NULL, чтобы оно сопоставлялось с int вместо int ?.

+0

Спасибо, Марк. Значение, которое я пытаюсь вернуть, это «ID», если строка, автоматически сгенерированная, первичный ключ, выбранная после добавления новой строки, используя SCOPE_IDENTITY(). Столбец не принимает значение null, которое вы можете понять, являясь первичным ключом. но результат может быть нулевым, если операция не выполнена успешно? –

+0

Первичные ключи обычно не могут быть обнуляемы. Как правило, если вставка не выполняется, вы получите исключение, а не null, хотя это, конечно же, зависит от того, какой API вы используете. –

+0

Это значение не может быть нулевым, но возвращение результата из хранимой процедуры может быть. –

0

Я хотел бы предложить следующее:

 int? ROWID = 0; 
     ........ 
     int result = ROWID.HasValue ? ROWID.Value : 0;