5

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

4

6 回答 6

7

使用单行SqlParameterCollection.AddWithValue方法

cmd.Parameters.AddWithValue("@username",username.Text);
于 2012-11-28T07:45:36.980 回答
2

或您可以尝试的其他变体

command.Parameters.Add(new SqlParameter("Name", dogName));
于 2012-11-28T07:48:01.737 回答
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每行类型的对象中),Query(例如Query<T>,但使用dynamic)和其他一些方法(绑定多个网格或多个对象等)。所有可笑的优化(IL 级元编程)都尽可能快。

于 2012-11-28T07:51:26.910 回答
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

于 2012-11-28T07:53:02.680 回答
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();
}
}
于 2014-10-17T10:26:09.607 回答
0

更好的是,使用我闪亮的新 Visual Studio 扩展。您在自己的文件中完整地在 sql 中声明参数。我的扩展程序将在您保存文件时运行您的查询,并使您成为一个在运行时调用的包装类,以及一个用于访问您的结果的结果类,智能感知无处不在。您将看到您的 sql 参数作为包装类的 Execute() 方法的参数。您将永远不必在 C# 中编写另一行参数代码、阅读器代码、cmd 甚至连接(除非您想自己管理)。没了没了:-)

于 2016-04-12T07:24:24.647 回答