Dapper、Oracleおよびコマンドパラメータ

c# dapper oracle orm parameters

質問

私は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(); }
}

それはなぜそうですか?

受け入れられた回答

基本的には:@ Vincentは言った: データ型の不一致はインデックスを使用不可能にする可能性がある

追加情報がなければ、dapperはいくつかの仮定を行います。これらの前提の1つは、文字列が引き続きデータベースでUnicodeになるため、デフォルトはDbType.Stringです。ほとんどの場合、これは正解または適切ですが、いくつかのシナリオではDynamicParametersている可能性があります。そのため、追加する文字列パラメータの型と長さをより明示的に指定するための機能( DynamicParameters経由)も提供します。



ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ