Dapper를 사용하여 MS Access에 쓰는 중 OleDbException 발생

dapper f# ms-access oledb

문제

Dapper를 사용하여 내 MS Access 데이터베이스에 삽입을 시도합니다. 이제는 데이터를 쿼리해도 문제가 없지만 삽입을 시도하면 System.Data.OleDb.OleDbException : Data type mismatch in criteria expression

코드는 다음과 같습니다.

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)

수락 된 답변

약간 파기 후에, 나는 원인을 찾아 낼 수 있었다 :

다음은 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
이 KB는 합법적입니까? 예, 이유를 알아보십시오.
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.