2013-02-11 1 views
0

저는 MySQL에서 Postgres로 변환 중이며 일부 linq 쿼리는 예외를 발생시킵니다. 특히, 비트 연산자 비교를 추가하는 쿼리에 문제가 발생합니다. SQL 문자열의 매개 변수가 named (: p1, : p2, : p3) 대신 위치 (?) 인 것으로 나타났습니다.NHibernate + Npqsql + LINQ는 "매개 변수 p1이 쿼리에서 발견되지 않습니다"

왜 그런가?

column1_39_, grant0 _. "Version"을 (를) column2_39_, ... 및 grant0 _. "IsPublic \"= TRUE 또는 (grant0_)으로 선택하십시오. \ "UserId \"가 null이 아님) grant0 _. "UserId \"=?) 및 grant0 _. \ "PermissionFlags \"&? =?

이름 : P1 - 값 : 9011 이름 : P2 - 값 : 4 이름 : P3 - 값 : 4

편집 :

I합니다 (NpqsqlCommand.ReplaceParameterValue이를 보았다) 기능 -을 더 많은 연산자를 포함해야 할 수도 있습니다. 나는 그것으로 실험하고있다.

String pattern = "[- |\n\r\t,)(;=+/<>][:|@]" + parameterMarker + parameterName + "([- |\n\r\t,)(;=+/<>]|$)"; 

답변 : 내가 내 자신의 질문에 대답 나쁜 양식을하지 않습니다 희망, 그러나 문제는 그들이 '&'기호를 수행 할 때 Npgsql 드라이버 2.0.12가 제대로 매개 변수를 대체하지 않습니다. 비트 필드로 정수를 사용할 때 발생합니다. 아래는 Linq입니다 :

Where(g => (g.flag & flag) == flag) 

패치를 Npgsql 팀에 제출합니다.

+0

Npgsql.NpgsqlCommand.ReplaceParameterValue()에서 예외가 발생하므로 데이터베이스에 연결하는 것으로 생각하지 않습니다. – LogicMan

+0

ReplaceParameterValue의 Npgsql 드라이버에서이 정규식을 보았습니다. "[- | \ n \ r \ t, (= =// <>) [: | @]"+ parameterMarker + parameterName + " – LogicMan

+0

@LogicMan 답을 직접 찾으신다면 아래에 답변으로 게시해야합니다. (예 : + = 받아들이는 대답으로 표시하십시오 (귀하에게 전화하기 전에 며칠이 지연됩니다). –

답변

1

내 자신의 질문에 답하는 것이 좋지 않지만 Npgsql 드라이버 2.0.12가 '&'기호를 따라갈 때 매개 변수를 올바르게 대체하지 못하는 문제가 있기를 바랍니다. 비트 필드로 정수를 사용할 때 발생합니다. 아래는 Linq입니다 :

Where(g => (g.flag & flag) == flag) 

패치를 Npgsql 팀에 제출합니다.

관련 문제