Dapper & MS Access - Lecture fonctionne, écriture non

ado.net c# dapper ms-access oledb

Question

Commençons par retirer cela: je suis coincé avec un MS Access DB et je ne peux pas le changer.

Cela fonctionne bien:

using (OleDbConnection conn = ConnectionHelper.GetConnection())
{
  conn.Open();
  var results = conn.Query<string>(
    "select FirstName from Students where LastName = @lastName", 
    new { lastName= "Smith" }
  );
  conn.Close();
}

Cela fonctionne bien:

using (OleDbConnection conn = ConnectionHelper.GetConnection())
{
  OleDbCommand cmd = new OleDbCommand(
    "update Students set FirstName = @firstName, City = @city where LastName = @lastName", 
    conn
  );
  cmd.Parameters.AddWithValue("firstName", "John");
  cmd.Parameters.AddWithValue("city", "SomeCity");
  cmd.Parameters.AddWithValue("lastName", "Smith");

  conn.Open();
  var result = cmd.ExecuteNonQuery();
  conn.Close();
}

Ce n'est pas ... il s'exécute sans erreur mais il définit le prénom comme "SomeCity" dans la base de données et la ville comme "John":

using (OleDbConnection conn = ConnectionHelper.GetConnection())
{
  conn.Open();
  var results = conn.Query<string>(
    "update Students set FirstName = @firstName, City = @city where LastName = @lastName", 
    new { firstName = "John", city = "SomeCity", lastName = "Smith" }
  );
  conn.Close();
}

Des idées?

MODIFIER CI-DESSOUS

Dapper fonctionne si j'utilise DynamicParameters:

using (OleDbConnection conn = ConnectionHelper.GetConnection())
{
  DynamicParameters parameters = new DynamicParameters();
  parameters.Add("firstName", "John");
  parameters.Add("city", "SomeCity");
  parameters.Add("lastName", "Smith");

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

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