2011-01-01 12 views
0

Mögliche Duplizieren:
Parameterizing a SQL IN clause?.Net SQL Parameter für Listen Problem

ich ein C# Programm schreibe, in dem ich eine Abfrage an SQL Server senden verarbeitet und einen Datensatz zu kehrt zurück. Ich verwende Parameter, um Informationen an die Abfrage zu übergeben, bevor sie an den SQL-Server gesendet werden. Dies funktioniert gut, außer in der folgenden Situation.

Die Abfrage sieht wie folgt aus:

reportQuery = 
" 
Select * 
From tableName 
Where Account_Number in (@AccountNum); 
and Account_Date = @AccountDate 
"; 

Der AccountDate Parameter Arbeiten finden aber nicht die AccountNum Parameter.

Ich brauche die letzte Abfrage wie folgt auszuführen:

Select * 
From tableName 
Where Account_Number in ('AX3456','YZYL123','ZZZ123'); 
and Account_Date = '1-Jan-2010' 

Das Problem ist, dass ich diese Kontonummern (eigentlich Text) in einer C# String-Liste haben. Um es dem Parameter zuzuführen, habe ich den Parameter als String deklariert. Ich drehe die Liste in eine Zeichenfolge und führe sie dem Parameter zu. Ich denke, das Problem ist, dass ich die Paramater bin Fütterung dies:

"'AX3456','YZYL123','ZZZ123'" 

wenn sie will diese

'AX3456','YZYL123','ZZZ123' 

Wie kann ich die String-Liste in die Abfrage mit einem Parameter erhalten und haben es ausführen, wie gezeigt über?

So deklariere und weise ich den Parameter zu.

SqlParameter AccountNumsParam = new SqlParameter(); 
AccountNumsParam.ParameterName = "@AccountNums"; 
AccountNumsParam.SqlDbType = SqlDbType.NVarChar; 
AccountNumsParam.Value = AccountNumsString; 

FYI, AccountNumString == " 'AX3456', 'YZYL123', 'ZZZ123'"

+1

Welche Version von SQL Server? Wenn 2008 Table Valued Parameters verwendet, wenn nicht [diese Antwort] (http://stackoverflow.com/questions/337704/parameterizing-a-sql-in-clause) für eine Vielzahl von Möglichkeiten oder [Erland Sommarskog - Arrays und Listen in SQL Server] (http://www.sommarskog.se/arrays-in-sql.html) –

+0

Es ist 2008. Ich werde das überprüfen und zurückkommen. Vielen Dank! –

+0

Ich mochte nicht die gewählte Antwort in dem oben genannten "Duplikat". Sonst hätte ich das selbst geschlossen. Jetzt kann ich nicht die Antwort wählen, die ich mag. Die Verwendung von Table Valued Parameters hat sehr gut funktioniert. –

Antwort

-1

Wie wäre:

cmd.Parameters.AddWithValue("@AccountNums", string.Join(",", accountNums.ToArray())); 
+0

-1: das funktioniert nicht –

+0

John hat eine Milliarde Ruf. Ich bin versucht, sein Wort darauf zu nehmen. –

+0

Ich hätte "'" + string.Join ("', '", accountNums.ToArray()) + "'" setzen müssen, aber das funktioniert immer noch nicht. Weiß jemand warum? –

0

Dies ist eines jener Dinge, die nicht wie einfach wie es scheint. Eine Option wäre, eine parametrisierte Abfrage nicht zu verwenden und die Abfrage nicht selbst zu erstellen. Dies würde Sie jedoch leicht für SQL-Injection-Angriffe öffnen und wird daher im Allgemeinen nicht empfohlen.

Eine andere Option, die ich gesehen habe, besteht darin, die Werte als kommagetrennte Zeichenfolge zu übergeben und dann auf eine UDF zu verlassen, um sie für Sie auszuwerten.

Eine dritte Option (die, die ich am besten mag von dem, was verfügbar ist), besteht darin, die Daten in XML zu serialisieren, als xml-Datentyp weiterzuleiten und dann eine Unterabfrage nach dem IN-Schlüsselwort auszuführen von der XML. Um ehrlich zu sein, habe ich das vorher nur mit Stored Procedures gemacht, also kann ich nicht mit Sicherheit sagen, ob es auch in einer parametrisierten Abfrage funktionieren würde, obwohl ich es mir denken würde.

Blick auf meinem Blog zu sehen, wie XML in SQL Server abfragen: http://www.journeymandeveloper.com/ViewBlogPost/Query-XML-with-SQL-Server.aspx