Oracle과 함께 Dapper 사용
Oracle을 데이터베이스 공급자로 사용하고 있으며, 일부 데이터 액세스 계층(유지보수가 어렵고 XSD를 병합하기가 더 어려운)을 하단 계층의 Dapper를 사용하여 보다 안전한 저장소 기반 패턴으로 교체하는 방안을 검토했습니다.그러나 오라클과 함께 사용할 때는 여러 가지 문제가 발생했습니다.
명명된 매개 변수: 이러한 매개 변수는 쿼리에 사용될 때마다 무시되는 것처럼 보이며 Oracle이 원하는 순서대로 해석하는 것 같습니다.SqlMapper가 올바르게 명명된 매개 변수를 반환하지만 Oracle에서 올바르게 해석되지 않습니다.
변수에 대한 "@" 명명 규칙이 오라클 명명 매개 변수와 호환되지 않습니다.매개 변수 앞에 ":"가 표시될 것으로 예상됩니다.
이전에 이 문제를 해결한 적이 있는 사람이 있습니까?
IMO, 여기서 올바른 접근법은 (승인된 답변에 따라) 데이터베이스 특정 매개변수 접두사를 사용하지 않는 것입니다.@
sql-server의 경우,:
오라클의 경우) - 대신 접두사를 전혀 사용하지 않습니다.따라서 궁극적으로 다음과 같습니다.
il.Emit(OpCodes.Ldstr, prop.Name);
(등)
특히, a.static
자산은 한 공급업체당 한 곳으로 제한되기 때문에 좋지 않을 것입니다.AppDomain
.
Dapper가 이 변경 사항으로 업데이트되었습니다.또한 이제 동적으로 감지합니다.BindByName
그리고 그에 따라 그것을 설정합니다 (모두에 대한 참조가 필요하지 않습니다.OracleCommand
).
명명된 매개 변수 문제의 해결은 Oracle 명령을 사용하려면 BindByName 속성을 true로 설정해야 하기 때문인 것으로 나타났습니다.이 문제를 해결하려면 SqlMapper 자체를 수정해야 합니다.이 수정은 휴대용이 아니기 때문에 다소 불쾌하지만(특정 Oracle 명령에 대한 유형 검사에 의존함) 현재로서는 필요에 맞게 작동합니다.변경 사항에는 SetupCommand 메서드를 업데이트한 후, 다음과 같이 입력한 연결 개체에서 명령을 생성한 후 확인하고 플래그를 설정합니다(~ln 635).
var cmd = cnn.CreateCommand();
if (cmd is OracleCommand)
{
((OracleCommand)cmd).BindByName = true; // Oracle Command Only
}
마지막으로 CreateParamInfoGenerator 메서드를 변경하는 것과 관련된 매개 변수 이름의 "@"에서 ":" 문제를 해결합니다.정적 문자열 - 기본 매개 변수 문자 값을 ":"로 설정한 다음 l530을 다음에서 수정했습니다.
il.Emit(OpCodes.Ldstr, "@" + prop.Name); // stack is now [parameters] [c
로.
il.Emit(OpCodes.Ldstr, DefaultParameterCharacter + prop.Name); // stack is now [parameters] [command] [name] (Changed @ to : for oracle)
그리고 546에서:
il.Emit(OpCodes.Ldstr, "@" + prop.Name); // stack is now [parameters] [parameters] [parameter] [parameter] [name] (Changed @ to : for oracle)
대상:
il.Emit(OpCodes.Ldstr, DefaultParameterCharacter + prop.Name); // stack is now [parameters] [parameters] [parameter] [parameter] [name] (Changed @ to : for oracle)
이로 인해 대퍼는 Oracle 명령을 완벽하게 사용할 수 있게 되었습니다.
언급URL : https://stackoverflow.com/questions/6212992/using-dapper-with-oracle
'programing' 카테고리의 다른 글
잘못된 SQL을 반환하는 Larvel 마이그레이션 (0) | 2023.08.09 |
---|---|
파일을 다중 요소 파일로 변환하는 중 (0) | 2023.08.09 |
ASP 활용.자체 데이터 암호화를 위한 NET machineKey (0) | 2023.08.09 |
도커 오류로 도커 컨테이너를 삭제할 수 없습니다. 충돌: 리포지토리 참조를 제거할 수 없습니다. (0) | 2023.08.04 |
jQuery: print_r() 디스플레이 등가물? (0) | 2023.08.04 |