Dapper의 IN 절 지원에 대한 잘못된 점은 무엇입니까?

dapper sql-server

문제

나는 IN 절에 대한 쿼리 매개 변수의 자동 확장을 위해 Dapper (v1.42) 지원을 사용하려고합니다. 내 검색어는 다음과 같습니다.

var records = db.Query(
    "SELECT [IdCol], [OtherCol], [TinyIntCol], [TextCol] FROM [Tbl] WHERE [FilterCol] = @filterVal AND [TinyIntCol] IN @byteVals",
    new { filterVal = ..., byteVals = flag ? new byte[] { Constants.Byte1, Constants.Byte2 } : new byte[] { Constants.Byte1 } }
);

그러나 그 결과 System.Data.SqlClient.SqlException (0x80131904) : '@byteVals'근처의 구문이 잘못되었습니다.

나는 틀린 일을해야 할 것이다. 그러나 나는 무엇이 확실하지 않다. 어떤 바보 같은 짓을하는지 말해줘. 고맙습니다!

수락 된 답변

문제는 바이트 배열을 사용하는 것입니다. Dapper는 항상 바이트 배열을 단일 이진 값으로 전달합니다. 쿼리 텍스트에 "IN"절이 있으면 변경되지 않습니다 (@Damien_The_Unbeliever의 주석 참조).

예를 들어, 매개 변수 확장이 int 배열로 작업 중이기 때문에 다음 작업 (NORTHWND 데이터베이스 기반)

var results = db.Query<Product>(
    "SELECT * FROM Products WHERE ProductId IN @ids",
    new
    {
        ids = new [] { 1, 2 } // This works (int array)
    }
);

..하지만 바이트 배열을 전달하려고하면 다음과 같이 실패합니다.

var results = db.Query<Product>(
    "SELECT * FROM Products WHERE ProductId IN @ids",
    new
    {
        ids = new byte[] { 1, 2 } // This fails (byte array)
    }
);

SQL 프로파일 러를 사용하면 첫 번째 int 배열 접근 방식으로 다음 쿼리가 생성됩니다.

exec sp_executesql
    N'SELECT * FROM Products WHERE ProductId IN (@ids1,@ids2)',
    N'@ids1 int,@ids2 int',
    @ids1=1,
    @ids2=2

전달되는 개별 매개 변수를 명확하게 볼 수 있습니다.

바이트 배열 접근 방식은 다음과 같은 쿼리를 발생시킵니다.

exec sp_executesql
    N'SELECT * FROM Products WHERE ProductId IN @ids',
    N'@ids varbinary(2)',
    @ids=0x0102

여기에서 "@ids"매개 변수는 개별 매개 변수로 확장되지 않고 단일 값으로 전달됩니다. 이것이 문제의 원인입니다.

바이트 배열을 채우기 위해 바이트 값을 사용하여이를 해결할 수 있어야합니다.



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