Mappage du gestionnaire de chaîne en varchar dans dapper

dapper

Question

J'ai trouvé ces codes dans Dapper:

sealed partial class DbString : Dapper.SqlMapper.ICustomQueryParameter
{
    ...

    public void AddParameter(IDbCommand command, string name)
    {
        ...
        var param = command.CreateParameter();
        param.ParameterName = name;
        param.Value = (object)Value ?? DBNull.Value;
        if (Length == -1 && Value != null && Value.Length <= 4000)
        {
            param.Size = 4000;
        }
        else
        {
            param.Size = Length;
        }
        ...
    }
}

pouvez-vous me dire pourquoi le code ici doit comparer la longueur à 4000?

Je vous remercie.

Réponse acceptée

Cache de plan de requête.

Les requêtes suivantes sont séparées et indépendantes:

select @foo

et

select @foo

Si vous êtes confus, c'est que le bit que je n'ai pas montré était la déclaration de paramètre - dans le premier, il s'agit de nvarchar(12) et dans le second, de nvarchar(20) . Ce que le code essaie d' éviter est une requête unique, exécutée deux fois - par exemple une fois avec hello (5 caractères) et une fois avec world! (6 caractères) ayant deux plans d'interrogation distincts; c'est beaucoup moins efficace que de permettre aux deux de partager un plan, et le nombre d'occasions où ce choix aurait un impact négatif est extrêmement faible.

En standardisant la longueur à une valeur arbitraire, cela permet à la plupart des valeurs communes d'utiliser le même cache de plan de requête. Le 4000 est assez arbitraire (enfin, en fait il a été choisi car nvarchar(4000) est la taille maximale avant de commencer à entrer dans le territoire max ), et il pourrait tout aussi bien être 200 , ou ce que vous voulez. Le code fonctionne sur la base que la plupart des valeurs de temps sont relativement courts, donc s'il y a des valeurs plus élevées, ils seront l'exception plutôt que la règle.

Notez que tout cela ne se produit que si vous n'avez pas défini la Length explicitement; Si vous voulez plus de contrôle sur cela, il suffit de définir .Length à ce que vous voulez . Les propriétés clés sont les suivantes:

  • IsAnsi - bascule entre unicode / not - le n dans [n][var]char(len)
  • IsFixedLength - bascule entre la longueur fixe / variable - le var dans [n][var]char(len)
  • Length - le len dans [n][var]char(len)
  • Value - le contenu réel



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