Мой SQLParameter не проходит NULL правильно - PullRequest
1 голос
/ 24 февраля 2009

У меня есть эта веб-форма C #, в которой есть поле выбора даты. Если дата не установлена ​​(по умолчанию), я хочу, чтобы она передавала NULL в базу данных. Это происходит внутри моего параметризованного запроса.

SqlParameter CMActionDate = new SqlParameter();
CMActionDate.ParameterName = "@ActionDate";
if (ActionDate.Equals(""))
  {
      CMActionDate.Value = System.Data.SqlTypes.SqlDateTime.Null;
  }
  else
  {
      CMActionDate.Value = ActionDate;
  }

Когда я включаю отладку, я вижу, что дата действительно "", поэтому она входит в оператор IF и устанавливает для actiondate.value значение {Null}, как я думаю, и должно.

Тем не менее.

Когда он переходит к выполнению запроса, я нажимаю на лупу и вижу это:

UPDATE table SET [action_date] = '' WHERE [id] = 2488

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

UPDATE table SET [action_date] = 'Null' WHERE [id] = 2488

Поскольку action_date действительно никогда не устанавливается в NULL, тогда значение в поле даты и времени возвращается к «01.01.1900 12:00:00 AM», и это само по себе является болью.

Я попытался установить CMActionDate.Value для следующих значений безрезультатно (я получаю тот же результат, что и выше.):

  • DBNull.Value;
  • "NULL";
  • SqlDateTime.Null;
  • нуль;

Справка.

EDIT

Может быть, я не был ясен? Да, конечно, параметризованный запрос выглядит так:

"UPDATE CM_Codebase SET [action_date] = '" + @ActionDate + "' WHERE [id] = " + @CM_id + "";

Но когда я отлаживаю эту вещь в VS, я ставлю точку останова прямо перед ExecuteNonQuery (); так что я вижу SQL, который он пытается запустить. Именно там я вижу реальный SQL и вижу бит, где action_date = ''.

Это помогает?

Ответы [ 3 ]

13 голосов
/ 24 февраля 2009

Вы не должны видеть ни '', ни 'Null'. Если вы правильно используете параметризованные запросы, они должны выглядеть следующим образом:

ОБНОВЛЕНИЕ таблицы SET [action_date] = @ActionDate WHERE [id] = @ ID

Целая точка параметризованного запроса состоит в том, что фактическое значение параметра никогда не подставляется непосредственно в строку запроса.

Ваш код запроса должен выглядеть примерно так:

string sql = "UPDATE table SET [action_date]= @ActionDate WHERE [id]= @CM_id";

using (var cn = new SqlConnection("your connection string here."))
using (var cmd = new SqlCommand(sql, cn))
{
    cmd.Parameters.Add("@ActionDate", SqlDbTypes.DateTime).Value = 
         ActionDate.Equals("")? DBNull.Value : DateTime.Parse(ActionDate);
    cmd.Parameters.Add("@CM_id", SqlDbTypes.Int).Value = 2488;

    cn.Open();
    cmd.ExecuteNonQuery();
}

Результатом этого кода является то, что параметры вашего запроса отправляются на сервер в виде данных. Ни в одной точке вашего кода C # вы никогда не сможете просмотреть строку запроса с подставленными данными: она отправляется на сервер отдельно.

Это предотвращает любую возможность выполнения сервером значения параметра в виде кода из-за ошибки в очистке значения вашего параметра. Данные полностью разделены, и, в первую очередь, их не нужно очищать для этого контекста. Это также позволяет серверу кэшировать и повторно использовать план выполнения для запроса, что приводит к (небольшому) повышению производительности.

1 голос
/ 24 февраля 2009

Ваш параметризованный запрос должен показывать

UPDATE table SET [action_date] = @ActionDate WHERE [id] = @id

И значение параметра должно иметь нулевое эквивалентное значение.

Ваш sql

"UPDATE CM_Codebase SET [action_date] = '" + @ActionDate + "' 
 WHERE [id] = " + @CM_id + "";

Что на самом деле не имеет смысла. Вы должны позволить sql заменить @ActionDate и @CM_ID, а не создавать динамический SQL-запрос.

Ваш sql должен быть буквально:

String sql = "UPDATE table SET [action_date] = @ActionDate WHERE [id] = @CM_id"

Не должно быть конкатенации строк вокруг переменных, и они не должны быть заключены в кавычки.

0 голосов
/ 24 февраля 2009

Ваш запрос, безусловно, не похож на опубликованный.

Ваш @параметр должен быть внутри вашей строки для правильного чтения. Вы видите ActionDate = '', поскольку @ActionDate, скорее всего, не существует.

Вам нужно что-то вроде

string sql = "UPDATE CM_Codebase SET [action_date] = @ActionDate WHERE [id] = @CM_id";

Обратите внимание, что конкатенация строк не происходит.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...