【问题标题】:get output dapper with query executed获取执行查询的输出dapper
【发布时间】:2019-02-05 16:06:08
【问题描述】:

我有在 sqlserver 中执行查询的代码,在错误异常中使用 dapper 访问我想要使用指定参数执行查询:

StringBuilder sql = new StringBuilder();
sql.AppendLine(" SELECT " + campoChave + " AS CODIGO, ");
sql.AppendLine("        " + campoSelecao + " AS DESCRICAO ");
sql.AppendLine("   FROM " + tabela);
sql.AppendLine("   where codigoidioma = @codigoIdioma");
sql.AppendLine("  ORDER BY " + campoSelecao);

IEnumerable entities2 = conexao.Query<ComboBoxGenerico>(sql.ToString(), new { codigoIdioma = 1 });

此代码有错误我想在使用命令执行 dapper 后获取查询

例如:选择睾丸作为 codigo ..... 其中 codigoidioma = 1

@codigoIdioma ---> 1

【问题讨论】:

  • 小注:如果要使用StringBuilder,最好全部使用,即sql.Append(" SELECT ").Append(campoChave).AppendLine(" AS CODIGO, ");等;不言而喻,您需要真的小心不要让用户输入campoChavecampoSelecao 等 - 因为这将允许 SQL 注入
  • 如果您想记录查询,this 可能会有所帮助,即使它使用 Dapper Extensions。在内部,它创建profiled connection,然后用于记录。

标签: parameters output dapper


【解决方案1】:

执行命令后的查询几乎总是...正是您传入的内容。Dapper 不会替换 参数标记 - 这将是一个 SQL 注入漏洞。即使使用监控 SQL 流量的工具(mini-profiler、SQL server profiler 等):显示的命令将包括参数标记,参数单独发送。

Mini-profiler 欺骗,通过(在显示中)在命令前面加上看起来像参数的 declare 语句,这样你就可以在 SSMS 中运行它 - 这会给你类似的东西:

declare @codigoidioma int = 1;
select teste as codigo ..... where codigoidioma = @codigoidioma

但请注意,即使在这里它仍然是参数化的(ish)。

在 dapper 的情况下特别是,对于某些特定场景,例如 @ 987654324@(类似于List&lt;int&gt;foo),它将生成适当的参数扩展,但仍将被参数化

【讨论】:

  • 在上面的这个例子中可以轻松生成查询,但是如果它是一个插入或更新代码,在这种情况下将作为参数传递一个具有所有属性的语言对象我将如何获得这个查询?
  • @user3576807 您使用的是哪些具体方法?例如,您在使用 dapper.contrib 等吗?在这些情况下,我会再次说“miniprofiler”(nuget.org/packages/MiniProfiler) - 不直接与 dapper 相关,但它是由同一个团队提供的,它是我们与 dapper 一起用于我们自己的系统/查询监控(我们例如,在 Stack Overflow 上的每个页面请求中使用它);但同样:它只会给你参数化的形式,而不是替换参数的形式,因为dapper不这样做
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-05
  • 1970-01-01
相关资源
最近更新 更多