Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 转义sql字符串的简单方法?_C#_.net_Sql_Ado.net - Fatal编程技术网

C# 转义sql字符串的简单方法?

C# 转义sql字符串的简单方法?,c#,.net,sql,ado.net,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}而不是?使用参数化查询可以保护您的系统免受SQL注入攻击 当然,您可以处理S

在我的代码中,到处都有

command.Parameters.Add("@name", DbType.String).Value = name;
有没有更简单的方法?我很想做像这样的事情

command.command.CommandTextFn("insert into tbl(key,val) values(?, ?);", key, value);

并让它确定键/值是字符串还是int。我不介意是否必须使用
{0}
而不是

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

当然,您可以处理SQL转义,但是为什么要麻烦呢?你可能会犯错误,然后在为时已晚的时候发现它

请阅读本文,解释使用参数化查询的优缺点

投入时间改进其他代码。

您做的是正确的-使用参数是重用代码和保护您免受SQL注入攻击的最佳解决方案。。它没有坏,所以不要修理它

如果它真的让你感到不舒服(而且不应该),那么你可能可以用一种扩展方法做一些创造性的事情,让你把那一点代码包装成更小的东西,但实际上有更好的事情需要担心。

使用这种方法:

您可以将其与扩展方法结合使用:

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;
}

尝试用linq to 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()

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

不要这样做!它使您容易受到SQL注入攻击!您已经使用的方式可能是最好的……我不认为他希望使用未经参数化的查询,只是一种更简单的方式来构建它们。?当人们试图以“不是一个真正的问题”来结束这件事时。。。对我来说,它看起来像一个。我也发现multiple AddWithValue调用接口过于冗长,令人恼火,因此我很高兴看到帮助器方法的建议,以使其平滑。您有一个输入错误,应该是
names[I],values[I]
(由于该死的6个字符最小限制,无法编辑)
var command = connection.CreateCommand( "insert into tbl (key,val) values(@key,@val)",
                                        new string[] { "@key", "@val" },
                                        new object[] { key, val } );
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()