1

我在 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(); }
}

为什么会这样?

4

1 回答 1

0

基本上:@Vincent 所说的:数据类型不匹配会使索引无法使用

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

于 2013-02-22T00:33:40.187 回答