Dapper y varchars

dapper varchar

Pregunta

Encontré el siguiente comentario en la página de inicio del proyecto Dapper .NET .

Dapper admite varchar params, si está ejecutando una cláusula where en una columna varchar con un parámetro, asegúrese de pasarlo de esta manera:

    Query<Thing>("select * from Thing where Name = @Name", new {Name = 
    new DbString { Value = "abcde", IsFixedLength = true, Length = 10, IsAnsi = true });

En el Servidor SQL es crucial usar el Unicode al consultar unicode y ansi al consultar unicode no

Estoy evaluando Dapper para su uso con una base de datos heredada (SQL Server 2008), con muchos procedimientos almacenados con parámetros varchar, y estoy un poco confundido por esta restricción.

Con código ADO.NET hecho a mano, utilizaría lo siguiente para la consulta anterior:

new SqlParameter("@Name", "abcde")

sin especificar si es unicode o no, ni la longitud.

  • ¿Por qué necesito esta sintaxis DbString detallada con Dapper, especificando la longitud de la columna, IsFixedLength e IsAnsi?

  • ¿Por qué IsFixedLength = true para una columna varchar (espero que sea cierto para una columna char o nchar)?

  • ¿Debo usar DbString así para los parámetros del procedimiento almacenado?

Esperaba que Dapper hiciera mi código DAL más conciso, pero esto parece estar volviendo más detallado para los parámetros varchar.

ACTUALIZAR

Investigué un poco más para intentar entender por qué Dapper tendría esta restricción varchar, que no parece tener en mi código artesanal, donde normalmente crearía un parámetro de entrada de la siguiente manera:

var parameter = factory.CreateParameter(); // Factory is a DbProviderFactory
parameter.Name = ...;
parameter.Value = ...;

y generalmente deja que el proveedor infiera el DbType usando sus propias reglas, a menos que yo específicamente lo DbType .

Mirando la clase DynamicParameters de Dapper, tiene un método AddParameters que crea los parámetros de la siguiente manera:

var dbType = param.DbType; // Get dbType and value
var val = param.Value;     // from 

...
// Coerce dbType to a non-null value if val is not null !!!!!
if (dbType == null && val != null) dbType = SqlMapper.LookupDbType(val.GetType(),name);
...
var p = command.CreateParameter();
...
if (dbType != null)                     
{                         
    p.DbType = dbType.Value;                     
}

Es decir, coacciona explícitamente IDataParameter.DbType a un valor que busca con su propio algoritmo, en lugar de dejar que el proveedor use sus propias reglas.

¿Hay alguna buena razón para esto? Me parece incorrecto, especialmente a la luz del comentario sobre el apoyo de Dapper para los parámetros varchar.

Respuesta popular

Necesita esta sintaxis cuando trabaja con ODBC.

Debería definir un campo CHAR (30) como un DbString en c # para Dapper y también establecer los valores de longitud (30) y ansi (verdadero) para evitar que Dapper suponga que el string era de tipo text / blob. De lo contrario, es probable que reciba el error: "Intento ilegal de convertir texto / tipo de blob de bytes".

Estaba obteniendo este error usando ODBC para conectarme a Informix hasta que definí mi param como un DbString () y establecí los valores de longitud y ansi.

Más información aquí .



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é