У меня возникли проблемы с правильным синтаксисом, позволяющим передавать в базу данных строку или NULL. Вот мой код:
string insertString = String.Format(
@"INSERT INTO upload_history (field1, field2, field3)
VALUES ('{0}', '{1}', '{2}')",
varField1, varField2, varField3);
Я использовал одинарные кавычки вокруг заполнителей переменных, чтобы база данных правильно принимала строковое значение. Однако, если передается NULL, он попадает в базу данных как строка «NULL».
Есть ли способ оставить одинарные кавычки в строке InsertCommand и условно добавить одинарные кавычки к моим переменным?





Не объединяйте строку (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-инъекций.
@buzzzzjay добавьте (object) перед любым из них.
Сладкий! Это действительно помогает! Спасибо!
Концентрация строки с помощью 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();
Тоже отличный ответ, но Марк опередил вас. Спасибо за предложение.
В духе ответа на вопрос в том виде, как он был задан, и с полным пониманием того, что рефакторинг кода для параметризации запросов является правильным решением, вы могли бы написать функцию, которая возвращает либо строку в одинарных кавычках, либо строковое значение 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 - это несложно :-)
Я получаю следующую ошибку при использовании "someVar ?? DBNull.Value", как указано выше: "Operator '??' не может применяться к операндам для типа string и System.DBNull "Есть мысли о том, как это будет работать со строкой?"