OleDbException al escribir en MS Access utilizando Dapper

dapper f# ms-access oledb

Pregunta

Estoy tratando de hacer una inserción con Dapper en mi base de datos de MS Access, ahora consultar los datos funciona bien, pero cuando pruebo una inserción obtengo un System.Data.OleDb.OleDbException : Data type mismatch in criteria expression

El código es:

let conn = new OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=path;Persist Security Info=False;")

let exec f =
    try
        conn.Open()
        do f() 
    finally
        conn.Close()

[<CLIMutable>]
type Timecard =
    { Id          : int
      Employee    : string
      WorkDate    : DateTime
      Hours       : int
      Description : string
      BillType    : string }

exec (fun () -> 
        let tc = { Id = 0
                   Employee = "John Doe" 
                   WorkDate = DateTime.Today 
                   Hours = 10
                   Description = "working 9 to 5"
                   BillType = "BillableInternal" }
        conn.Execute("insert into Timecards (Employee, WorkDate, Hours, Description, BillType) values (@Employee, @WorkDate, @Hours, @Description, @BillType)", tc)             
       |> ignore)

Respuesta aceptada

Después de excavar, pude encontrar una causa:

A continuación, se muestra un delegado de CreateParamInfoGenerator de SqlMapper de dapper:

    public static Action<IDbCommand, object> CreateParamInfoGenerator(Identity identity)
    {

        // code above here
        IEnumerable<PropertyInfo> props = type.GetProperties().OrderBy(p => p.Name); 

Los accesorios son su param unánime que se vuelve a ordenar por OrderBy (p => p.Name), que mueve la ciudad por adelantado.

new { firstName = "John", city = "SomeCity", lastName = "Smith" }

Props luego se agrega a los parámetros de IDbCommand donde el orden es importante.

Si hago un comentario sobre la cláusula OrderBy (), todo funciona.

También probé DynamicParameters y reordené intencionalmente los atributos para mover la ciudad por adelantado:

        var parameters = new DynamicParameters();
        parameters.Add("city", "SomeCity");
        parameters.Add("firstName", "John");
        parameters.Add("lastName", "Smith");

        var result = dbConnection.Query<string>(
          "update Students set FirstName = @firstName, City = @city where LastName = @lastName",
          parameters
        );

Lo anterior no funcionó tan bien, ¡así que el orden de los atributos es la razón!

Supongo que puede modificar su copia local de SqlMapper por el momento y eliminar OrderBy () y esperar un veredicto oficial de Marc ...

Espero que esto ayude.


Respuesta popular

Tuve un problema similar, lo que hice fue use parameter names like @param1, @param2 lugar de @ name, @ id, @ price para que la orden se mantuviera igual sin tener que modificar el archivo SQLMapper.cs.

Algo como

public void Update(Movie movie)
{
  var sql = "UPDATE myDB.movies set title=@param1, genre=@param2 where ID=@param3";
  db.Execute(sql, new { param1 = movie.Title, param2 = movie.Genre, param3 = movie.ID });
}


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é