轻松逃脱SQL字符串的方法?

时间:2009-12-12 12:40:45

标签: c# .net sql ado.net

在我的代码中我到处都有这个

command.Parameters.Add("@name", DbType.String).Value = name;

有更简单的方法吗?我很想做像

这样的事情
command.command.CommandTextFn("insert into tbl(key,val) values(?, ?);", key, value);

并确定键/值是字符串还是int。如果我不得不使用{0}代替?

,我不介意

5 个答案:

答案 0 :(得分:13)

使用AddWithValue方法:

command.Parameters.AddWithValue( "@name", name );

您可以将此功能与扩展方法结合使用:

public static SqlCommand CreateCommand(this SqlConnection connection, string command, string[] names, object[] values )
{
     if (names.Length != values.Length)
     {
          throw new ArgumentException("name/value mismatch");
     }

     var cmd = connection.CreateCommand();
     cmd.CommandText = command;
     for (int i = 0; i < names.Length; ++i )
     {
         cmd.Parameters.AddWithValue(names[i], values[i]);
     }

     return cmd;
}

用作

var command = connection.CreateCommand( "insert into tbl (key,val) values(@key,@val)",
                                        new string[] { "@key", "@val" },
                                        new object[] { key, val } );

答案 1 :(得分:4)

使用参数化查询可以保护您的系统免受SQL注入攻击。

当然,你可以处理SQL转义,但为什么要这么麻烦?你可以犯错误,只是为时太晚才发现它。

请阅读this article,因为它使用参数化查询解释了优缺点。

投入时间改进其他代码。

答案 2 :(得分:4)

你正在做正确的事情 - 使用参数 是重用代码和保护你免受SQL注入攻击的最佳解决方案..它不是破了所以不要修理它!

如果确实错误(并且它不应该),那么你可以用扩展方法做一些有创意的事情,以允许你将这些代码包装成更小但实际上更小的东西还有更好的事情需要担心。

答案 3 :(得分:2)

创建一组带有参数名称和值的通用函数。包装并隐藏所有样板代码。

答案 4 :(得分:0)

尝试用linq替换这样的调用到sql。您将在编译时获得类型检查,不再需要转义字符串并考虑sql注入。

样品:

Dim newCustomer = New Customer With {.CustomerID = "MCSFT", .CompanyName = "Microsoft", .ContactName = "John Doe", .ContactTitle = "Sales Manager", .Address = "1 Microsoft Way", .City = "Redmond", .Region = "WA", .PostalCode = "98052", .Country = "USA", .Phone = "(425) 555-1234", .Fax = Nothing}
db.Customers.Add(newCustomer)
db.SubmitChanges()