Проблема при вставке строки или NULL в базу данных SQL Server

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

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

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

Есть ли способ оставить одинарные кавычки в строке InsertCommand и условно добавить одинарные кавычки к моим переменным?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
7
0
10 830
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Не объединяйте строку (string.Format) - используйте параметры (@p1 и т. д.) - тогда вы можете передать DBNull.Value для обозначения null в 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-инъекций.

Я получаю следующую ошибку при использовании "someVar ?? DBNull.Value", как указано выше: "Operator '??' не может применяться к операндам для типа string и System.DBNull "Есть мысли о том, как это будет работать со строкой?"

buzzzzjay 03.11.2011 18:48

@buzzzzjay добавьте (object) перед любым из них.

Marc Gravell 03.11.2011 18:51

Сладкий! Это действительно помогает! Спасибо!

buzzzzjay 03.11.2011 18:53

Концентрация строки с помощью 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();

Тоже отличный ответ, но Марк опередил вас. Спасибо за предложение.

beardog 17.12.2008 16:40

В духе ответа на вопрос в том виде, как он был задан, и с полным пониманием того, что рефакторинг кода для параметризации запросов является правильным решением, вы могли бы написать функцию, которая возвращает либо строку в одинарных кавычках, либо строковое значение 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 - это несложно :-)

Другие вопросы по теме