Dapper、Oracle 和命令参数

Posted

技术标签:

【中文标题】Dapper、Oracle 和命令参数【英文标题】:Dapper, Oracle and Command Parameter 【发布时间】:2013-02-19 10:39:49 【问题描述】:

我在 Oracle 中有一个名为 MESSAGE 的表,它有一列 TERMINALID (VARCHAR2 8 NOT NULL);并且该列有一个索引。该表大约有 300,000,000 条记录。

现在,可以正常工作(0.0 秒)

using (var con = new OracleConnection(connectionString2))

    try
    
        con.Open();

        var parameters = new DynamicParameters();
        parameters.Add("PTerminalId", value: "04447777", dbType: System.Data.DbType.AnsiString);
        Console.WriteLine("ora - messages #0", con.Query<decimal>("SELECT COUNT(*) FROM MESSAGE WHERE TERMINALID=:PTerminalId", param: parameters).FirstOrDefault());
    
    finally  con.Close(); 

并且失败(超时)

using (var con = new OracleConnection(Properties.Settings.Default.GSMConnectionString2))

    try
    
        con.Open();

        Console.WriteLine("ora - messages #0", con.Query<decimal>("SELECT COUNT(*) FROM GSM.MESSAGE WHERE TERMINALID=:PTerminalId", param: new  PTerminalId = "04447777" ).FirstOrDefault());
    
    finally  con.Close(); 

为什么会这样?

【问题讨论】:

第一个代码在 0.0 秒内运行;第二个代码超时。 有没有办法在第二个查询中指定参数的数据类型? 否;我不喜欢它。 这可能是第一个查询使用索引而第二个不使用的原因:a datatype mismatch can make indexes unusable。两个查询的 SQL 跟踪可能会提供解释。 Tnx;这听起来像是原因。我会在记录较少的表上尝试一下,看看它是否真的返回了一些东西并报告回来。 【参考方案1】:

基本上:@Vincent 所说的:a datatype mismatch can make indexes unusable。

在没有额外信息的情况下,dapper 会做出一些假设。其中一个假设是您的字符串在数据库中将继续是 unicode,因此它默认为 DbType.String。在大多数情况下,这是正确的或足够的,但在某些情况下可能会出现错误 - 这就是为什么我们还提供工具(通过DynamicParameters)更明确地说明要添加的字符串参数的类型和长度。

【讨论】:

以上是关于Dapper、Oracle 和命令参数的主要内容,如果未能解决你的问题,请参考以下文章

Dapper Oracle数据库 插入(INSERT)数据时参数指定为null的方法

Dapper提供程序相关参数令牌

c# dapper mysql like 参数化

[转][Dapper]SQL 经验集

Dapper入门教程——执行非查询语句

100天精通Oracle-实战系列(第21天)Oracle 数据泵常用参数和命令