Saltar al contenido

Pasar parámetros de consulta en Dapper usando OleDb

Luego de buscar en diferentes repositorios y sitios webs finalmente hemos dado con la resolución que te compartimos pronto.

Solución:

Lo siguiente debería funcionar:

var result = conn.Query(
"select code, name from mytable where id = ?id? order by name",
new  id = 1 );

Importante: ver respuesta más reciente


En la compilación actual, la respuesta sería “no”, por dos razones:

  • el código intenta filtrar los parámetros no utilizados, y actualmente los está eliminando a todos porque no puede encontrar nada como @id, :id o ?id en el sql
  • el código para agregar valores de tipos usa un orden arbitrario (bueno, está bien: alfabético) para los parámetros (porque la reflexión no ofrece ninguna garantía sobre el orden de los miembros), lo que hace que los argumentos posicionales anónimos sean inestables

La buena noticia es que ambos son reparables.

  • podemos condicionar el comportamiento de filtrado
  • podemos detectar la categoría de tipos que tiene un constructor que coincide con todos los nombres de propiedades y usar las posiciones de los argumentos del constructor para determinar el orden sintético de las propiedades; los tipos anónimos entran en esta categoría

Al hacer esos cambios en mi clon local, ahora pasa lo siguiente:

// see https://stackoverflow.com/q/18847510/23354
public void TestOleDbParameters()

    using (var conn = new System.Data.OleDb.OleDbConnection(
        Program.OleDbConnectionString))
    
        var row = conn.Query("select Id = ?, Age = ?", new DynamicParameters(
            new  foo = 12, bar = 23  // these names DO NOT MATTER!!!
        )  RemoveUnused = false  ).Single();
        int age = row.Age;
        int id = row.Id;
        age.IsEqualTo(23);
        id.IsEqualTo(12);
    

Tenga en cuenta que actualmente estoy usando DynamicParameters aquí para evitar agregar aún más sobrecargas a Query / Query – porque esto debería agregarse a un número considerable de métodos. agregándolo a DynamicParameters lo resuelve en un solo lugar.

Estoy abierto a recibir comentarios antes de impulsar esto. ¿Te parece útil?


Editar: con la adición de un funky smellsLikeOleDb (no, no es broma), ahora podemos hacer esto aún más directamente:

// see https://stackoverflow.com/q/18847510/23354
public void TestOleDbParameters()

    using (var conn = new System.Data.OleDb.OleDbConnection(
        Program.OleDbConnectionString))
    
        var row = conn.Query("select Id = ?, Age = ?",
            new  foo = 12, bar = 23  // these names DO NOT MATTER!!!
        ).Single();
        int age = row.Age;
        int id = row.Id;
        age.IsEqualTo(23);
        id.IsEqualTo(12);
    

Eres capaz de auxiliar nuestro estudio mostrando un comentario y puntuándolo te lo agradecemos.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *