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는 몇 가지 가정을합니다. 이러한 가정 중 하나는 문자열이 계속 데이터베이스에서 유니 코드가 될 것이므로 기본적으로 DbType.String 입니다. 대부분의 경우 이것이 정확하거나 적절하지만 일부 시나리오에서는 오산 될 수 있습니다. 따라서 우리는 추가 할 문자열 매개 변수의 유형과 길이에 대해 더 명시 적으로 ( DynamicParameters 를 통해) 기능을 제공합니다.



아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.