SqlCommand, передавая то, что может быть нулевым - PullRequest
3 голосов
/ 17 ноября 2011

У меня есть команда SQL, которую меня попросили изменить, и у меня возникают некоторые проблемы с тем фактом, что то, что я передаю SQL, теперь может быть нулевым. Если я передаю значение, я могу положиться на columnName = @parameterName в SQL, но с NULL я не могу передать null или DBNull и правильно его разрешить.

Вот псевдокод SQL:

SELECT
  Columns
FROM
  ClientSetup
WHERE
  Client_Code = @ClientCode AND
  Package_Code = @PackageCode AND
  Report_Code = @ReportCode

Проблема в том, что теперь @ReportCode может действительно быть NULL. В моем коде C #, где я настроил SqlCommand, я могу вставить:

cmd.Parameters.Add("@ReportCode", SqlDBType.VarChar, 5).Value = reportType;
  //reportType is a string, which can be null

Но, если reportType имеет значение null, мне нужно использовать Report_Code IS NULL в SQL, а не Report_Code = @ reportCode.

Решение, которое я нашел, состоит в том, чтобы заменить последнее предложение where на следующее:

((@ReportCode IS NULL AND Report_Code IS NULL) OR Report_Code = @ReportCode)

и фраза для параметра

cmd.Parameters.Add("@ReportCode", SqlDBType.VarChar, 5).Value = string.IsNullOrEmpty(reportType) ? System.DBNull : reportType;

То, что это делает, работает, но мне было интересно, знает ли кто-нибудь более чистый или лучший способ обработки обнуляемых параметров при передаче вещей в SQL из кода .NET.

Ответы [ 3 ]

2 голосов
/ 17 ноября 2011

Короткий ответ: нет, API SqlClient требует от вас DbNull.Value для значений параметра NULL.

Но у меня есть некоторые сомнения относительно того, как вы обрабатываете NULL.Для одного вы используете string.IsNullOrEmpty, что означает, что вы рассматриваете строку emtpy как NULL.Это сомнительно, в базе данных могут быть допустимые пустые строковые значения.

Моя вторая проблема - логика сопоставления пустых значений в базе данных.Чаще всего передача параметра NULL означает, что запрос заинтересован в любом значении, а не конкретно в значениях NULL.Я не говорю, что ваша логика сопоставления NULL-параметров со значениями NULL ошибочна, я просто хочу убедиться, что вы знаете, что делаете.

0 голосов
/ 17 ноября 2011

Ну, правильно, как вы это исправите

только (@ReportCode IS NULL И Report_Code IS NULL) не является необходимым. потому что это не c # o c ++.

Некоторые, как это должно быть, наконец, результат

 SELECT
   Columns
 FROM
   ClientSetup
 WHERE
   Client_Code = @ClientCode
   AND Package_Code = @PackageCode
   AND (Report_Code = @ReportCode or @ReportCode is null)
0 голосов
/ 17 ноября 2011

Многое, в прошлом я создавал запрос

тестовый отчетный код для нуля, если он заменяет ReportCode = @ReportCode на "ReportCode is Null", добавьте параметр reportcode, если это не так.

Как правило, хотя ReportCode со значением NULL сигнализировал, я хотел выбрать на основе других параметров, и мне было все равно, что такое NULL.

Это немного непослушно

, ноГде IsNull (ReportCode, '') = IsNull (@ReportCode, '')

даст вам то, что вы хотите, если вы используете IsNullOrEmpty.

...