将字符串或NULL插入SQL Server数据库时出现问题

时间:2008-12-17 13:27:27

标签: c# sql sql-server

我无法想出允许将字符串或NULL传递给数据库的正确语法。这是我的代码:

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

我在变量占位符周围使用单引号,以便数据库正确接受字符串值。但是,如果传递NULL,它最终会以字符串“NULL”进入数据库。

有没有办法可以将单引号从InsertCommand字符串中删除并有条件地将单引号添加到我的变量中?

3 个答案:

答案 0 :(得分:22)

不要连接字符串(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注入

答案 1 :(得分:5)

使用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 :(得分:2)

本着回答问题的精神,并且充分意识到重构代码以使查询顺序化是正确的解决方案,您可以编写一个返回单引号字符串或非引用字符串的函数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函数 - 这并不难: - )