Dapper, Oracle y parámetro de comando

c# dapper oracle orm parameters

Pregunta

Tengo una tabla en Oracle llamada MESSAGE y tiene una columna TERMINALID (VARCHAR2 8 NOT NULL); y hay un índice para esta columna. Hay aproximadamente 300,000,000 de registros en esta tabla.

Ahora, esto funciona bien (0.0 segundos) :

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

Y esto falla (agota el tiempo) :

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

¿Por qué es así?

Respuesta aceptada

Básicamente: qué dijo @Vincent: un desajuste de tipos de datos puede hacer que los índices no se puedan usar .

Sin información adicional, dapper hace algunas suposiciones. Una de esas suposiciones es que su cadena continuará siendo unicode en la base de datos, por lo que se establece de manera predeterminada en DbType.String . En la mayoría de los casos esto es correcto o adecuado, pero puede comportarse mal en algunos escenarios, por lo que también brindamos la posibilidad (a través de DynamicParameters ) de ser más explícitos sobre el tipo y la longitud del parámetro de cadena para agregar.



Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué