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 和命令参数的主要内容,如果未能解决你的问题,请参考以下文章