manejador mapeo de cadena a varchar en dapper

dapper

Pregunta

Encontré este código en 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;
        }
        ...
    }
}

¿Puede decirme por qué el código aquí necesita comparar la duración con 4000?

gracias.

Respuesta aceptada

Caché del plan de consulta.

Las siguientes consultas son independientes y separadas:

select @foo

y

select @foo

Si está confundido, eso se debe a que el bit que no se mostró fue la declaración del parámetro; en el primero, es nvarchar(12) y en el segundo es nvarchar(20) . Lo que el código intenta evitar es una sola consulta, ejecutada dos veces, por ejemplo una vez con hello (5 caracteres) y una vez con world! (6 caracteres) que tienen dos planes de consulta separados; que es mucho menos eficiente que permite a ambos compartir un plan, y el número de ocasiones en que esta opción tendría un impacto negativo cosas es extremadamente pequeña.

Al estandarizar la longitud en algún valor arbitrario, permite que la mayoría de los valores comunes usen el mismo caché de plan de consulta. El 4000 es bastante arbitrario (bueno, en realidad fue elegido porque nvarchar(4000) es el tamaño máximo antes de que comience a entrar en territorio max ), y podría haber sido 200 , o lo que sea que quieras. El código está trabajando sobre la base de que la mayor parte de los valores de tiempo son bastante corto, por lo que si hay valores más grandes, que será la excepción y no la regla.

Tenga en cuenta que todo esto solo ocurre si no ha establecido la Length explícitamente; si desea tener más control sobre esto, simplemente configure .Length a lo que desea . Las propiedades clave son:

  • IsAnsi - cambia entre unicode / not - la n en [n][var]char(len)
  • IsFixedLength - cambia entre longitud fija / variable - la var en [n][var]char(len)
  • Length : len en [n][var]char(len)
  • Value - los contenidos reales


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é