Informix 및 Dapper를 사용하여 쿼리에 매개 변수를 추가하면 구문 예외가 발생하여 실패합니다.

asp.net-mvc c# dapper informix

문제

Informix에서 ODBC를 통해 매개 변수가있는 쿼리를 사용하려고 시도하지만이 예외가 발생하면 매개 변수를 추가하려는 모든 시도가 실패합니다.

$exception {"ERROR [42000] [Informix .NET provider][Informix]A syntax error has occurred."} System.Exception {IBM.Data.Informix.IfxException}

다음은 실패한 코드입니다.

List<ItemAttribute> items = con.Query<ItemAttribute>("select * from oe_cnvwrk where cwr_genero = @cwr_genero", new{cwr_genero = cwr_genero}).ToList();

이 예제처럼 매개 변수없이 사용하면 완벽하게 작동하지만 주입 공격까지 응용 프로그램이 열립니다.

ItemHeader itemHeader = con.Query<ItemHeader>("select * from oe_cnvhdr where hdr_control_id = " + hdr_control_id).Single();

나는 정확히 똑같은 이슈에 대해 이전에 열거 된 질문을 찾을 수 있었지만 결코 대답하지 못했다. 누군가가 문제를 처리하는 방법에 대한 아이디어를 갖기를 바라고 있습니다. Dapper는 매개 변수를 추가하지 않습니다.

어떤 아이디어가 이것을 해결하는 방법입니까, 아니면 작동 할 수도있는 Dapper로 매개 변수화를 처리하는 다른 방법이 있습니까?

전문가 답변

아직 NuGet에 공개되지는 않았지만 소스 코드 에는 이제 의사 위치 매개 변수에 대한 지원이 포함됩니다. 이것들은 패턴 인식에 의해 구현되어, ?abc? 텍스트에서 abc 라는 이름의 매개 변수에 매핑되지만 위치는 ? 통사론. 따라서 다음을 발행 할 경우 :

List<ItemAttribute> items = con.Query<ItemAttribute>(
    "select * from oe_cnvwrk where cwr_genero = ?cwr_genero?",
    new{cwr_genero = cwr_genero}).ToList();

그것은 일해야한다; 실행 된 실제 쿼리는 다음과 같습니다.

select * from oe_cnvwrk where cwr_genero = ?

여기서 추가 된 매개 변수는 cwr_genero 라고 표시된 구성원의 매개 변수입니다. 이렇게하면 구성원을 올바르게 확인할 수 있습니다. 특별한 ?foo? 패턴은 위치 매개 변수로 전환하는 표시기로 사용됩니다.

개별 매개 변수는 쿼리 당 한 번만 참조 할 수 있습니다. 다음은 작동 하지 않습니다 .

select * from sometable where foo = ?x? or bar = ?x?


아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow