【问题标题】:View SQL statment to be executed in Dapper查看Dapper中要执行的SQL语句
【发布时间】:2014-12-12 22:00:11
【问题描述】:

我想知道在将参数解析为 SQL 字符串后,是否可以查看 SQL 语句的实际外观。例如给出以下代码:

const string SQL = @"
SELECT *
   FROM V_PROVIDER_WAGE_OVER_REVENUE
WHERE SITE_ID = :SITE_ID 
   AND VENDOR_ID = :VENDOR_ID
   AND date_paid >= :DATE_FROM 
   AND date_paid <= :DATE_TO;";

conn.Query<ProviderWageOverRevenueModel>(SQL, new { 
     VENDOR_ID = vendorId, 
     SITE_ID = siteId, 
     DATE_FROM = dateFrom, 
     DATE_TO = dateTo 
}).ToList();

我想知道是否在某个时候(可能在 Dapper 源中?)我可以看到类似的内容:

SELECT *
   FROM V_PROVIDER_WAGE_OVER_REVENUE
WHERE SITE_ID = 199
   AND VENDOR_ID = 17
   AND date_paid >= '01/01/2014' 
   AND date_paid <= '20/11/2014';

编辑

我假设参数占位符将被替换为值,但是根据仔细查看 Dapper 的源代码后,我意识到它只是在 iDbCommand 上中继来执行查询,所以在查看了这个 question 它之后.Net里面可以看到执行的语句吗?

我试试这个:

string query = cmd.CommandText;
foreach (DbParameter p in cmd.Parameters)
{
    query = query.Replace(p.ParameterName, p.Value.ToString());
}

然而结果似乎不像我希望的那样:

SELECT *
    FROM V_PROVIDER_WAGE_OVER_REVENUE
WHERE 23411127316 = :23411127316 
    AND 23411076816 = :23411076816
    AND date_paid >= :1/07/2014 10:11:34 PM 
    AND date_paid <= :12/12/2014 12:00:00 AM;

【问题讨论】:

  • 您是否假设 Dapper 将参数占位符替换为参数的实际值?
  • 是的,我假设参数占位符将被替换为值,但是根据link,它查看 Source dapper 只是在 IDbCommand 上中继。
  • 没错。不仅 Dapper,其他所有 NET 提供商都以这种方式工作。您可以使用服务器上的某种监控工具看到服务器接收到的真实sql。从参数前缀看这可能是MySql或Oracle,你需要在他们的支持工具中搜索(Sql Server有Profiler)
  • 谢谢@Steve,您回复时我只是在编辑问题。事实上它是Oracle 我将看看支持工具。祝您有美好的一天,再次感谢您。

标签: .net ado.net dapper


【解决方案1】:

就基本问题而言:最简单的方法是使用小型分析器和包装连接之类的工具。

Dapper 确实有一些查询操作的东西 - 但实际上:在所示的情况下没有。所以简单的回答就是执行的SQL正是SQL的内容。

大多数 ADO.NET 提供程序都支持一直到数据库的参数。如果您的提供者,那么除非通过您的数据库自己的监控工具,否则它将不可见。

【讨论】:

    猜你喜欢
    • 2012-06-17
    • 1970-01-01
    • 2021-10-20
    • 2010-09-08
    • 1970-01-01
    • 2017-07-16
    • 1970-01-01
    • 1970-01-01
    • 2017-05-08
    相关资源
    最近更新 更多