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

时间:2012-11-28 07:44:08

标签: c# asp.net sql parameterized

所以我最近了解到我绝对应该使用参数化查询来避免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循环或其他东西并以某种方式参数化循环中的每个变量一样?

6 个答案:

答案 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甚至连接中编写另一行参数代码(除非您想自己管理)。已经走了: - )