Dapper, Oracle et paramètre de commande

c# dapper oracle orm parameters

Question

J'ai une table dans Oracle nommée MESSAGE et elle a une colonne TERMINALID (VARCHAR2 8 NOT NULL); et il y a un index pour cette colonne. Il y a environ 300 000 000 enregistrements dans ce tableau.

Maintenant, cela fonctionne très bien (0.0 seconde) :

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

Et cela échoue (expire) :

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

Pourquoi c'est comme ça?

Réponse acceptée

Fondamentalement: ce que @Vincent a dit: une incompatibilité de type de données peut rendre les index inutilisables .

Sans informations supplémentaires, Dapper fait des hypothèses. L'une de ces hypothèses est que votre chaîne va continuer à être unicode au niveau de la base de données, par défaut DbType.String . Dans la plupart des cas, ceci est correct ou adéquat, mais il peut se comporter mal dans certains scénarios. C'est pourquoi nous fournissons également la possibilité (via DynamicParameters ) d'être plus explicite sur le type et la longueur du paramètre de chaîne à ajouter.



Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi