Следующий код выдает ошибку - «Нет неявного преобразования из DBnull в int».
SqlParameter[] parameters = new SqlParameter[1];
SqlParameter planIndexParameter = new SqlParameter("@AgeIndex", SqlDbType.Int);
planIndexParameter.Value = (AgeItem.AgeIndex== null) ? DBNull.Value : AgeItem.AgeIndex;
parameters[0] = planIndexParameter;
c#
dbnull
sqlparameter
относительность
источник
источник
==
в конце 3-й строки?)Ответы:
Проблема заключается в том, что
?:
оператор не может определить тип возвращаемогоint
значения, поскольку вы либо возвращаете значение, либо значение типа DBNull, которые несовместимы.Конечно, вы можете привести экземпляр AgeIndex к типу,
object
который удовлетворял бы?:
требованию.Вы можете использовать
??
оператор слияния нуля следующим образомВот цитата из документации MSDN для
?:
оператора, которая объясняет проблемуисточник
AgeItem.AgeIndex as object
??
является то же решением , как если бы вы использовали регулярные тройной?:
- вам все равно нужно гипсAgeItem.AgeIndex
к объекту:planIndexParameter.Value = AgeItem.AgeIndex.HasValue ? (object)AgeItem.AgeIndex : DBNull.Value;
.?:
для сравнения конкретных типов, тогда приведение всего выражения не сработает. Вы должны разыграть не-dbnull параметр следующим образом:someID == 0 ? DBNull.Value : (object)someID
Принятый ответ предполагает использование броска. Однако большинство типов SQL имеют специальное поле Null, которое можно использовать, чтобы избежать этого приведения.
Например,
SqlInt32.Null
«Представляет DBNull, который может быть назначен этому экземпляру класса SqlInt32».источник
exampleNoCast
объявлен объект, поэтому приведение к объекту все еще происходит. Если, как и в коде OP, значение присваивается непосредственно SqlParameter.Value, который также имеет тип объекта, тогда вы все равно получите приведение.Вам необходимо передать
DBNull.Value
как пустой параметр в SQLCommand, если в хранимой процедуре не указано значение по умолчанию (если вы используете хранимую процедуру). Наилучший подход - назначитьDBNull.Value
любой пропущенный параметр перед выполнением запроса, и следующий foreach сделает эту работу.В противном случае измените эту строку:
Следующим образом:
Потому что вы не можете использовать разные типы значений в условных выражениях, так как DBNull и int отличаются друг от друга. Надеюсь, это поможет.
источник
С одной строкой кода попробуйте это:
источник
Попробуй это:
источник
Если вы используете условный (троичный) оператор, компилятору требуется неявное преобразование между обоими типами, в противном случае вы получите исключение.
Таким образом, вы можете исправить это, приведя один из обоих к
System.Object
:Но так как результат не очень хорош, и вы всегда должны помнить это приведение, вы можете использовать такой метод расширения:
Тогда вы можете использовать этот краткий код:
источник
На мой взгляд, лучше сделать это с помощью свойства Parameters класса SqlCommand :
источник
DBNull.Value
, ADO.NET может быть довольно сложно угадать, какой это может быть SqlDbType ........ это удобно - но немного опасно ...Подумайте об использовании доступной структуры Nullable (T). Это позволит вам устанавливать значения только в том случае, если они у вас есть, и ваши объекты SQL Command будут распознавать обнуляемое значение и обрабатываться соответствующим образом без каких-либо хлопот с вашей стороны.
источник
источник
Попробуй это:
Другими словами, если параметр имеет значение null, просто не отправляйте его в свой хранимый процесс (при условии, конечно, что хранимый процесс принимает нулевые параметры, что подразумевается в вашем вопросе).
источник
попробуйте что-то вроде этого:
источник
Я так решаю.
источник
источник
Это то, что я просто делаю ...
источник
источник
Простой метод расширения для этого будет:
источник
Я использую простой метод с нулевой проверкой.
источник
Мой код, работающий в реальном проекте. Посмотрите на троичный оператор, прежде чем сделать sqlparameter для меня лучшим способом, без проблем:
источник