2008-12-17 99 views
7

我遇到了允许将字符串或NULL传递到数据库的适当语法时遇到问题。这里是我的代码:将字符串或NULL插入到SQL Server数据库时出现问题

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

我用周围的变量占位符单引号,这样的数据库将适当接受字符串值。但是,如果传递NULL,它将以字符串“NULL”的形式进入数据库。

有没有办法让单引号离开InsertCommand字符串并有条件地向我的变量添加单引号?

回答

22

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

+0

使用“someVar ?? DBNull.Value”当我得到以下错误,如上面:“操作“ ??”不能应用于类型为string和System.DBNull的操作数“有关如何使用字符串的任何想法? – buzzzzjay 2011-11-03 14:48:49

+2

@buzzzzjay在其中任何一个前面添加一个“(对象)”。 – 2011-11-03 14:51:48

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

在回答这个问题,因为它是问,是充分认识到重构的代码paramaterizing查询是正确的解决办法的精神,你可以写一个返回无论是功能单引号字符串或非引号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功能给你 - 这是不难:-)

相关问题