所以我最近了解到我绝对应该使用参数化查询来避免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循环或其他东西并以某种方式参数化循环中的每个变量一样?
答案 0 :(得分:8)
使用单行SqlParameterCollection.AddWithValue方法
cmd.Parameters.AddWithValue("@username",username.Text);
答案 1 :(得分:2)
或您可能尝试的其他变体
command.Parameters.Add(new SqlParameter("Name", dogName));
答案 2 :(得分:2)
在这里......通过dapper:
connextion.Execute(sql, new {
username = username.Text,
id = 123, // theses are all invented, obviously
foo = "abc",
when = DateTime.UtcNow
});
映射到ExecuteNonQuery
,但还有其他方法,例如Query<T>
(通过名称非常有效地将数据绑定到每行T
类型的对象),{{1} }(如Query
,但使用Query<T>
)和其他一些(绑定多个网格或多个对象等)。所有可笑的优化(IL级元编程)都要尽可能快。
答案 3 :(得分:1)
另一种技巧,你可以使用..
List<SqlParameter> lstPrm = new List<SqlParameter>();
lstPrm.Add(new SqlParameter("@pusername", usernameValue ));
lstPrm.Add(new SqlParameter("@pID", someidValue));
lstPrm.Add(new SqlParameter("@pPassword", passwordValue));
添加您可以迭代的结尾,以在command object
答案 4 :(得分:0)
使用我的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();
}
}
答案 5 :(得分:0)
更好的是,使用my shiny new Visual Studio extension。你在sql中声明你的参数,在你自己的文件中完整无缺。我的扩展将在您保存文件时运行您的查询,并将使您成为一个在运行时调用的包装类,以及一个结果类来访问您的结果,并且智能感知到处都是。您将看到您的sql参数作为包装类的Execute()方法的参数。您永远不必在C#,读者代码或cmd甚至连接中编写另一行参数代码(除非您想自己管理)。已经走了: - )