Preguntas sobre consultas y parámetros Dapper SQL con PostgreSQL

c# dapper dialect postgresql sql

Pregunta

Actualmente estoy aprendiendo sobre Dapper. He buscado mucho aquí y en otros lugares (incluido esto ) y no pude encontrar respuestas concretas a mis dudas:

¿Dapper usa un dialecto SQL genérico o es específico para el motor DB? Quiero decir, ¿utiliza la sintaxis SQL esperada en el motor de base de datos subyacente? Al principio y después de leer más de una docena de ejemplos, pensé que las consultas SQL eran genéricas, pero ahora, al probar ODBC de PostgresSQL, he encontrado problemas con la sintaxis y los parámetros.

Usando este ejemplo de clase POCO ...

public class CardType {

    //Autoincremented Key
    public int Id { get; set; }

    public string Type { get; set; }

    public string Description { get; set; }
}

... la siguiente línea no funciona para mí:

_connection.Execute(@"INSERT cardtypes (type, description) VALUES (@Type,  @Description)", cardType);

Primero, esta línea ataca una excepción ODBC porque espera la cláusula "INTO" antes de especificar la tabla. Además, los parámetros tampoco funcionan, porque si no me equivoco, los parámetros de PostgresSQL se configuran con el "?" símbolo y no con "@keyword". En la página de GitHub podemos encontrar esto:

Dapper no tiene detalles de implementación específicos de DB, funciona con todos los proveedores .NET ADO, incluidos SQLite, SQL CE, Firebird, Oracle, MySQL, PostgreSQL y SQL Server.

Así que estoy perdido con esto. :) Después de experimentar mucho, descubrí que poner todas las cosas de PostgresSQL funciona como se esperaba. Por ejemplo, todos los casos siguientes funcionaron:

//Manually parameters

var query = @"INSERT INTO cardtypes (type, description) values ('Administrator', 'The Boss')";
_db.Execute(query);


//Dynamic parameters

var dynamicParameters = new DynamicParameters();
dynamicParameters.AddDynamicParams(new {
    cardType.Type,
    cardType.Description
});

var query = @"INSERT INTO cardtypes (type, description) values (?, ?)";    //Note the '?' symbol
_db.Execute(query, dynamicParameters);


//Interpolating values
var query = $@"INSERT INTO cardtypes (type, description) values ('{cardType.Type}', '{cardType.Description}')";
_db.Execute(query);

Estos casos previos funcionaron bien. Pero estoy confundido al comprender si las consultas SQL son un dialecto SQL genérico o un dialecto de motor de base de datos específico.

También probé Dapper.Contrib y también falla con la instrucción INSERT, por ejemplo:

_db.Insert(new CardType() {
    Type = "Administrator",
    Description = "The Boss"
});

También falla ... una extraña excepción de carácter "[".

¿Qué estoy haciendo mal?

¡Mis saludos!

Respuesta aceptada

Dapper no intenta analizar su consulta u ofrecer una DSL personalizada. Más bien: transfiere su consulta directamente al proveedor de ADO.NET elegido. Lo hace hacer algunos ajustes en el camino en algunos casos, pero en el sentido general: es virgen.

En el caso de postgresql, los parámetros de IIRC tienen prefijos de dos puntos, no están prefijados. Intenta usar :foo lugar de @foo .



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é