参数化sql查询 – asp.net / c#

所以我最近了解到我绝对应该使用参数化查询来避免SQL注入等安全问题。 这一切都很好,所有,我得到它的工作。

此代码显示了我如何执行的一些代码:

param1 = new SqlParameter(); param1.ParameterName = "@username"; param1.Value = username.Text; cmd = new SqlCommand(str, sqlConn); cmd.Parameters.Add(param1); //and so on 

但问题是,我有超过14个需要保存到数据库的变量,它就像一个注册表单。 如果我必须将这些行写入14次以参数化每个变量,它看起来会非常混乱。 有没有更有活力的方法呢? 就像使用for循环或其他东西并以某种方式参数化循环中的每个变量一样?

使用单行SqlParameterCollection.AddWithValue方法

 cmd.Parameters.AddWithValue("@username",username.Text); 

或者您可能会尝试其他变体

 command.Parameters.Add(new SqlParameter("Name", dogName)); 

在这里你去……通过小巧玲珑 :

 connextion.Execute(sql, new { username = username.Text, id = 123, // theses are all invented, obviously foo = "abc", when = DateTime.UtcNow }); 

映射到ExecuteNonQuery ,但还有其他方法,如Query (通过名称非常有效地将数据绑定到每行T类型的对象), Query (如Query ,但使用dynamic ),以及一些其他(绑定多个网格或多个对象等)。 所有可笑的优化(IL级元编程)都要尽可能快。

另一种技术,你可以使用..

 List lstPrm = new List(); lstPrm.Add(new SqlParameter("@pusername", usernameValue )); lstPrm.Add(new SqlParameter("@pID", someidValue)); lstPrm.Add(new SqlParameter("@pPassword", passwordValue)); 

添加可以迭代的结尾以在command object插入参数

使用我的SqlBuilder类。 它允许您在不创建参数的情况下编写参数化查询,或者不必担心其调用的内容。 你的代码看起来像这样……

 var bldr = new SqlBuilder( myCommand ); bldr.Append("SELECT * FROM CUSTOMERS WHERE ID = ").Value(myId); //or bldr.Append("SELECT * FROM CUSTOMERS NAME LIKE ").FuzzyValue(myName); myCommand.CommandText = bldr.ToString(); 

您的代码将更短,更易读。 与连接查询相比,您甚至不需要额外的行。 你需要的课程在这里……

 using System; using System.Collections.Generic; using System.Text; using System.Data; using System.Data.SqlClient; public class SqlBuilder { private StringBuilder _rq; private SqlCommand _cmd; private int _seq; public SqlBuilder(SqlCommand cmd) { _rq = new StringBuilder(); _cmd = cmd; _seq = 0; } public SqlBuilder Append(String str) { _rq.Append(str); return this; } public SqlBuilder Value(Object value) { string paramName = "@SqlBuilderParam" + _seq++; _rq.Append(paramName); _cmd.Parameters.AddWithValue(paramName, value); return this; } public SqlBuilder FuzzyValue(Object value) { string paramName = "@SqlBuilderParam" + _seq++; _rq.Append("'%' + " + paramName + " + '%'"); _cmd.Parameters.AddWithValue(paramName, value); return this; } public override string ToString() { return _rq.ToString(); } } 

更好的是,使用我shiny的新Visual Studio扩展 。 你在sql中声明你的参数,在你自己的文件中完整无缺。 我的扩展将在您保存文件时运行您的查询,并将使您成为一个在运行时调用的包装类,以及一个结果类来访问您的结果,并使用intellisense到处。 您将看到sql参数作为包装类的Execute()方法的参数。 您永远不必在C#,读者代码或cmd甚至连接中编写另一行参数代码(除非您想自己管理)。 已经走了:-)