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

C# 将字符串或NULL插入SQL Server数据库时出现问题,c#,sql,sql-server,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。这是我的密码:

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
传递给SQL Server表示为null

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注入

将字符串与字符串放在一起。格式可能会带来很大的安全风险(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();

本着按要求回答问题的精神,并充分意识到重构代码以参数化查询是正确的解决方案,您可以编写一个函数,返回单引号字符串或非引号空字符串值,然后从查询字符串中删除单引号

string insertString = String.Format(    @"INSERT INTO upload_history (field1, field2, field3)     VALUES ({0}, {1}, {2})",    ToStringorNull(varField1), ToStringorNull(varField2), ToStringorNull(varField3));
如果您使用的是VS2008,您甚至可以将其实现为一个扩展方法

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

我将把创建ToStringorNull函数留给您—这并不难:—)

这也是一个很好的答案,但Marc在这方面胜过了您。谢谢你的建议。我在使用上面的“someVar??DBNull.Value”时遇到了以下错误:“运算符“??”不能应用于字符串类型和System.DBNull的操作数“关于如何处理字符串有什么想法吗?@buzzzjay在它们前面添加一个
(对象)
。太棒了!那真的很有帮助!谢谢