2013-02-19 92 views
1

我在Oracle中有一个名为MESSAGE的表,它有一个TERMINALID(VARCHAR2 8 NOT NULL)列;并且该列有一个索引。该表中约有3亿条记录。现在Dapper,Oracle和Command参数

这工作正常(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.0秒内运行;第二个代码超时。 – 2013-02-19 12:03:16

+0

有没有办法在第二个查询中指定参数的数据类型? – 2013-02-19 12:12:23

+0

否;我不喜欢它。 – 2013-02-19 12:30:56

回答

0

基本上:什么@Vincent说:a datatype mismatch can make indexes unusable

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