Dapper 및 System.Data.OleDb DbType.Date throw 'OleDbException : 데이터 형식이 조건 식에 일치하지 않습니다.'

dapper ms-access oledbconnection

문제

이 문제와 관련하여 문제를 제기해야하는지 확신 할 수 없으므로 누구나 먼저이 간단한 해결 방법을 알고 있는지 물어볼 생각입니다. OleDbConnection과 함께 Dapper를 사용할 때 MS Access 2003 (Jet.4.0)과 함께 사용할 때 오류가 발생합니다 (데이터베이스가 선택되지 않았습니다!).

아래의 테스트 코드를 실행할 때 'OleDbException : 조건 식의 데이터 형식이 일치하지 않습니다.'라는 예외가 발생합니다.

var count = 0;

using (var conn = new OleDbConnection(connString)) {

    conn.Open();
    var qry = conn.Query<TestTable>("select * from testtable where CreatedOn <= @CreatedOn;", new { CreatedOn = DateTime.Now });
    count = qry.Count();
}

OleDb 날짜와 과거의 경험에서 생각해 보면 DbType을 Date로 설정하면 OleDbType.Date 대신 OleDbType 속성의 값이 내부적으로 OleDbTimeStamp로 변경됩니다. 나는 이것이 Dapper 때문이 아니라는 것을 이해하지만 OleDbParameter 클래스에서 내부적으로 연결하는 이상한 방법으로 간주 될 수있는 것은 무엇입니까?

다른 ORM, 원시 ADO 또는 내 자신의 팩토리 개체를 사용하여 처리 할 때 명령을 실행하기 직전에 명령 개체를 정리하고 OleDbType을 날짜로 변경합니다.

명령 개체가 내부에있는 것처럼 보이는만큼 Dapper에서는 불가능합니다. 불행히도 나는 동적 인 생성물을 배울 시간이 없었기 때문에 간단한 것을 놓칠 수도 있었고, 단순히 문제를 제기하기보다는 수정을 제안하고 기여할 수도있었습니다.

이견있는 사람?

남자 이름

수락 된 답변

그것은 오래된 스레드지만, 같은 문제가있다 : 접근은 밀리 세컨드를 가진 DateTime을 좋아하지 않는다. 그래서 당신은 다음과 같이 확장 메소드를 추가해야한다.

var qry = conn.Query<TestTable>("select * from testtable where CreatedOn <= @CreatedOn;", new { CreatedOn = DateTime.Now.Floor(TimeSpan.FromSeconds(1)) });

매개 변수를 전달할 때 사용하십시오.

var qry = conn.Query<TestTable>("select * from testtable where CreatedOn <= @CreatedOn;", new { CreatedOn = DateTime.Now.Floor(TimeSpan.FromSeconds(1)) });

불행히도 현재 Dapper 버전 (1.42)에서는 기본 유형에 대한 사용자 정의 TypeHandler를 추가 할 수 없습니다 ( # 206 참조).

Dapper (DLL이 아닌 cs 파일 사용)를 수정하여이 끌어 오기 요청을 병합하면 각 매개 변수에 Floor 를 사용할 필요가 없습니다.

var qry = conn.Query<TestTable>("select * from testtable where CreatedOn <= @CreatedOn;", new { CreatedOn = DateTime.Now.Floor(TimeSpan.FromSeconds(1)) });



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