DbString, IsFixedLength e IsAnsi para varchar

dapper

Pregunta

Soy nuevo en Dapper, quiero saber por qué se sugiere a continuación, cuando mi código se ejecuta sin él.

Ansi Strings y varchar

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 SQL Server, es crucial utilizar el Unicode al consultar unicode y ansi al consultar no unicode.

A continuación está mi código, que se ejecuta en SQL Server 2012 sin usar DbString, etc.

create table Author (
 Id int identity(1,1),
 FirstName varchar(50),
 LastName varchar(50)
);
go
insert into Author (FirstName, LastName) values ('Tom', 'John');

        public Author FindByVarchar(string firstName)
        {
            using (IDbConnection db = DBHelper.NewSqlConnection())
            {
                return db.Query<Author>("Select * From Author WHERE FirstName = @firstName", new { firstName }).SingleOrDefault();
            }
        }

Preguntas:

1 ¿Por qué se usa el tipo DbString en este caso?

2 ¿Por qué la longitud se establece en 10 (por ejemplo, Longitud = 10) cuando "abcde" es 5?

3 ¿Todavía necesito usar DbString cuando funciona mi código actual?

4 ¿Es correcto establecer IsAnsi = falso para la columna Unicode?

5 Para la columna varchar, ¿es correcto establecer IsFixedLength = false e ignorar la configuración de Length?

Respuesta aceptada

El propósito del ejemplo es que está describiendo un escenario donde el tipo de datos es char(10) . Si acabamos de utilizar "abcde" , Dapper podría pensar que nvarchar(5) era apropiado. Esto sería muy ineficiente en algunos casos, especialmente en una cláusula where , ya que el RDBMS puede decidir que no puede usar el índice, y en cambio necesita escanear tablas haciendo una conversión de cadenas para cada fila en la tabla de char(10) a la versión nvarchar . Es por esta razón que DbString existe para ayudarlo a controlar exactamente cómo Dapper configura el parámetro para datos de texto.

Creo que esto responde tus 1 y 2.

3: ¿está utilizando ANSI (texto no unicode) o texto de ancho fijo? Tenga en cuenta que el valor predeterminado de ANSI también se puede establecer globalmente si siempre evita el uso de unicode

4: sí

5: sí

4 + 5 combinados: si usas nvarchar : solo usa string



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é