오라클과 함께 Dapper 사용하기

c# dapper oracle

문제

우리는 오라클을 데이터베이스 제공 업체로 사용하고 하부 레이어에서 Dapper를 사용하는 saner 저장소 기반 패턴으로 데이터 액세스 레이어 (유지 관리가 어려우며 XSD를 병합하기가 어려움) 일부를 대체하는 방법을 모색했습니다. 그러나 oracle에서 사용할 때 여러 가지 문제가 발생했습니다.

  • 명명 된 매개 변수 : 이것들은 무시되는 것처럼 보입니다. 오라클 쿼리에서 사용될 때마다 오라클은 임의의 순서로 해석합니다. SqlMapper는 올바르게 명명 된 매개 변수를 반환하며 오라클에서는 올바르게 해석되지 않습니다.

  • 변수의 "@"명명 규칙은 oracle 명명 된 매개 변수와 호환되지 않습니다. 모든 매개 변수 앞에 ":"가 표시됩니다.

이전에이 문제가 발생하여 해결 방법이있는 사람이 있습니까?

수락 된 답변

IMO, 여기에 올바른 접근 방식은하지에 (허용 대답에 따라)이다는 (그래서 데이터베이스 특정 매개 변수 접두사 사용 @ , SQL-서버 : Oracle 용) - 오히려 : 전혀 접두사를 사용하지 않습니다. 그래서 궁극적으로 이것은 :

il.Emit(OpCodes.Ldstr, prop.Name);

(기타)

특히 AppDomain 당 하나의 공급 업체로 제한되므로 static 속성이 좋지 않습니다.

이 변경으로 Dapper가 업데이트되었습니다. 또한 BindByName 동적으로 감지하여 BindByName 설정합니다 (모두 OracleCommand 대한 참조가 필요 없음).


인기 답변

Oracle 명령에서 BindByName 속성을 true로 설정해야하므로 명명 된 매개 변수 문제가 해결되었습니다. 이 문제를 해결하려면 SqlMapper 자체를 수정해야합니다. 비틀기가 이식성이 없기 때문에 (이것은 특정 오라클 명령에 대한 유형 검사에 의존한다) 조금 비싸다. 그러나 그것은 우리의 필요에 부합한다. 변경은 SetupCommand 메소드를 업데이트하는 것으로서, 우리가 입력 한 연결 객체를 명령 폼을 생성 한 후 so (~ ln 635)와 같은 플래그를 설정합니다 :

il.Emit(OpCodes.Ldstr, "@" + prop.Name); // stack is now [parameters] [c

마지막으로 CreateParamInfoGenerator 메서드를 변경하는 것과 관련된 매개 변수 이름의 "@"에서 ":"문제의 문제를 해결했습니다. 나는 정적 문자열을 추가했다. DefaultParameterCharacter의 값을 ":"으로 설정하고 다음에서 530을 수정했다.

il.Emit(OpCodes.Ldstr, "@" + prop.Name); // stack is now [parameters] [c

il.Emit(OpCodes.Ldstr, "@" + prop.Name); // stack is now [parameters] [c

및에서 ln 546 :

il.Emit(OpCodes.Ldstr, "@" + prop.Name); // stack is now [parameters] [c

에:

il.Emit(OpCodes.Ldstr, "@" + prop.Name); // stack is now [parameters] [c

오라클의 명령으로 완벽한 작업이 가능합니다.




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