Dapper&MS Access - 読み込み動作、書き込みは行いません

ado.net c# dapper ms-access oledb

質問

まずこの問題を解決しましょう:私はMS Access DBを使用していますが、変更できません。

これはうまくいきます:

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

これはうまくいきます:

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

これは...エラーなしで実行されますが、FirstNameを "SomeCity"としてDBに、Cityを "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();
}

何か案は?

下の編集

DynamicParametersを使用するとDapperが動作します:

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

受け入れられた回答

いくつかの掘削の後、私は原因を見つけることができました:

以下は、dapperのSqlMapperからのCreateParamInfoGeneratorデリゲートです。

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

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

小道具は、OrderBy(p => p.Name)によって再注文されたあなたの全員一致のパラメータです。

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

次に、順序が重要なIDbCommandパラメーターに小道具が追加されます。

OrderBy()節をコメントアウトすると、すべてが機能します。

私もDynamicParametersをテストし、意図的に属性を並べ替えて都市を前に移動させました:

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

上記はうまくいかなかったので、属性の順序が理由です!

私は今あなたのSqlMapperのローカルコピーを変更し、OrderBy()を削除し、Marcから公式の評決を待つことができると思います...

お役に立てれば。


人気のある回答

私はSQLMapper.csファイルを変更することなく、同じままになるように、@ name、@ id、@ priceの代わりに@ use parameter names like @param1, @param2use parameter names like @param1, @param2したのと同様の問題がありました。

何かのようなもの

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


ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow