Проблема вставки строки или NULL в базу данных SQL Server - PullRequest
7 голосов
/ 17 декабря 2008

У меня возникают проблемы с правильным синтаксисом, позволяющим передавать строку или значение NULL в базу данных. Вот мой код:

string insertString = String.Format(
    @"INSERT INTO upload_history (field1, field2, field3) 
    VALUES ('{0}', '{1}', '{2}')",
    varField1, varField2, varField3);

Я использовал одинарные кавычки вокруг переменных-заполнителей, чтобы база данных правильно принимала строковое значение. Однако, если передается NULL, он попадает в базу данных в виде строки «NULL».

Можно ли как-нибудь исключить одинарные кавычки из строки InsertCommand и условно добавить одинарные кавычки в мои переменные?

Ответы [ 3 ]

22 голосов
/ 17 декабря 2008

Не объединять строку (string.Format) - использовать параметры (@p1 и т. Д.) - тогда вы можете передать DBNull.Value, что означает нулевой для SQL Server

SqlCommand cmd = new SqlCommand();
cmd.CommandText = @"INSERT INTO upload_history (field1, field2, field3) 
   VALUES (@p1, @p2, @p3)";
cmd.Parameters.AddWithValue("@p1", (object)someVar ?? DBNull.Value);
//...

Это также защищает вас от внедрения SQL

5 голосов
/ 17 декабря 2008

Концентрация строки с помощью String.Format может быть большой угрозой безопасности (SQL-инъекция), а также проблематичной, если вы хотите вставить символ '.

Решение:

cmd.CommandText = "INSERT INTO upload_history (field1, field2, field3) " +
    "VALUES (@p1, @p2, @p3)";
cmd.Parameters.AddWithValue("@p1", varField1);
cmd.Parameters.AddWithValue("@p2", varField2);
cmd.Parameters.AddWithValue("@p3", varField3);
cmd.ExecuteNonQuery();
2 голосов
/ 17 декабря 2008

В духе ответа на вопрос в том виде, в котором он был задан, и полного понимания того, что рефакторинг кода для параметризации запросов является правильным решением, вы могли бы написать функцию, которая возвращает либо строку в одинарных кавычках, либо строку без кавычек Значение строки NULL, затем удалите одинарные кавычки из строки запроса.

string insertString = String.Format(    @"INSERT INTO upload_history (field1, field2, field3)     VALUES ({0}, {1}, {2})",    ToStringorNull(varField1), ToStringorNull(varField2), ToStringorNull(varField3));

Если вы используете VS 2008, вы можете даже реализовать его как метод расширения.

string insertString = String.Format(    @"INSERT INTO upload_history (field1, field2, field3)     VALUES ({0}, {1}, {2})",    varField1.ToStringorNull, varField2.ToStringorNull, varField3.ToStringorNull);

Я оставлю создание функции ToStringorNull вам - это не сложно: -)

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