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

이것은하지 않고 ... 그것은 오류없이 실행하지만 "John"으로 DB와 City에 "SomeCity"로 FirstName을 설정합니다.

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의 공식 판결을 기다릴 수있을 것입니다.

희망이 도움이됩니다.


인기 답변

비슷한 문제가 있었는데, use parameter names like @param1, @param2 @ @, @ id, @ price 대신 use parameter names like @param1, @param2use parameter names like @param1, @param2 하여 SQLMapper.cs 파일을 수정하지 않아도 동일한 순서로 유지됩니다.

좋아하는 것

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