OleDbException lors de l'écriture dans MS Access à l'aide de Dapper

dapper f# ms-access oledb

Question

J'essaie de faire une insertion avec Dapper dans ma base de données MS Access, l'interrogation des données fonctionne maintenant correctement, mais lorsque j'essaye un insert, j'obtiens une System.Data.OleDb.OleDbException : Data type mismatch in criteria expression

Le code est le suivant:

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)

Réponse acceptée

Après quelques fouilles, j'ai pu trouver une cause:

Voici le délégué 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); 

Les accessoires sont votre paramètre unanime qui est réordonné par OrderBy (p => p.Name), qui déplace la ville au premier plan.

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

Les accessoires sont ensuite ajoutés aux paramètres IDbCommand où l'ordre est important.

Si je commente la clause OrderBy (), alors tout fonctionne.

J'ai également testé DynamicParameters et réorganisé intentionnellement les attributs pour déplacer la ville en amont:

        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
        );

Ce qui précède n'a pas fonctionné aussi, donc l'ordre des attributs est la raison!

Je suppose que vous pouvez modifier votre copie locale de SqlMapper pour l'instant et supprimer OrderBy () et attendre un verdict officiel de Marc ...

J'espère que cela t'aides.


Réponse populaire

J'ai eu un problème similaire, ce que j'ai fait était d' use parameter names like @param1, @param2 au lieu de @ name, @ id, @ price afin que la commande reste la même sans avoir à modifier le fichier SQLMapper.cs.

Quelque chose comme

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 });
}


Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi