2012-04-20 13 views
7

Używanie Dappera, następujących rzutów: Incorrect syntax near ','.Dapper and In Condition

const string sql = 
    "select * from ZipToZipDistance z where z.NoRouteFound = 0" + 
    " and z.OriginZip in (@zips) or z.DestZip in (@zips)"; 
var zipStrings = zips.Select(x => x.ToString()).ToArray(); 
var result = connection.Query<ZipToZipDistance>(sql, 
    new { zips = zipStrings }); 

Hmm, SQL nie ma przecinków. Musi mieć coś wspólnego z parametrem. OriginZip i DestZipvarchar(10). zips jest IEnumerable<int>. Próbowałem używać zips jako parametru bez konwersji na ciągi. Ten sam błąd.

Wydaje się bardzo proste. Co ja robię źle?

+1

Usuń nawiasy z @zips – jaxxbo

+0

Had sam problem właśnie teraz i właśnie usunął Wsporniki/nawiasy wokół @zips. Tylko tak mówi jaxxbo. –

Odpowiedz

7

try:

const string sql = 
const string sql = 
    "select * from ZipToZipDistance z where z.NoRouteFound = 0" + 
    " and z.OriginZip in @zips or z.DestZip in @zips"; 
var zipStrings = zips.Select(x => x.ToString()); 
var result = connection.Query<ZipToZipDistance>(sql, 
    new { zips = zipStrings }); 
+0

Sam problem, na który napotykam jest to, że mogę tylko przekazać 2100 elementów w klauzuli IN, co wydaje się być lepszym ograniczeniem, ponieważ kiedy skonstruuję zapytanie przy użyciu konkatenacji łańcuchów, to działa dobrze. Oto co mam na myśli: Kodeks pracy: var query = @ "SELECT * FROM QuestionTags GDZIE QuestionID IN (" + idsCsvString + ")"; var results = conn.Query (zapytanie) .ToList(); – Marko

+0

Gdy robię tak, jak sugerujesz, pojawia się następujący błąd: Strumień protokołu zdalnego wywoływania procedur (RPC) strumieni danych przychodzących (TDS) jest niepoprawny. W tym żądaniu RPC podano zbyt wiele parametrów. Maksymalna to 2100 – Marko