0

我需要我的 sql 查询,其中包含应用于日志 porpose 的参数。

private dynamic GetInfo(int cdEmpresa)
{
    dynamic info = new ExpandoObject();

    StringBuilder sql = new StringBuilder();
    sql.AppendLine(" SELECT * from FROM EMPRESA E");
    sql.AppendLine(" WHERE cdEmpresa = @cdEmpresa ");

    using (IDbConnection cn = GetConnection(cdEmpresa).Connection)
    {
        Logger.Debug("SQL: " + sql.ToString()); // Does not apply the parameters, obviously

        cn.Open();
        info = cn.Query<dynamic>(sql.ToString(), new
        {
            cdEmpresa = cdEmpresa // i need to execute te sql to parametrize it, is there a way to parametrize it first its execution?
        }).ToList();

    }
    return infoCadastro;
}
4

1 回答 1

2

在处理您的查询时,您所要求的任何时候都不存在

即使在执行查询时,参数值也不会直接替换到 SQL 命令中。参数化查询的重点是代码就是代码,数据就是数据,两者永远不会交叉。这消除了任何注入攻击的可能性,无论您可能需要处理什么样的新语言功能、自定义转义字符或 unicode 怪异。

在服务器端,而不是这个:

SELECT * FROM [table] WHERE ID=1234;

更像是你运行这样的代码:

DECLARE @ID int;
SET @ID = LoadParameterValueFromClientQueryObject("ID");
SELECT * FROM [table] WHERE ID= @ID;

总是在处理一个变量,其中变量的值远离 sql​​ 语言编译器/优化器,直到命令已经编译到执行计划中。

于 2017-10-30T22:09:31.870 回答