Parametrisierte Abfragen mit LIKE- und IN-Bedingungen
Parametrisierte Abfragen .Net immer schauen, wie diese in den Beispielen:
SqlCommand comm = new SqlCommand(@"
SELECT *
FROM Products
WHERE Category_ID = @categoryid
",
conn);
comm.Parameters.Add("@categoryid", SqlDbType.Int);
comm.Parameters["@categoryid"].Value = CategoryID;
Aber ich bin mit einer Mauer versuchen, Folgendes zu tun:
SqlCommand comm = new SqlCommand(@"
SELECT *
FROM Products
WHERE Category_ID IN (@categoryids)
OR name LIKE '%@name%'
",
conn);
comm.Parameters.Add("@categoryids", SqlDbType.Int);
comm.Parameters["@categoryids"].Value = CategoryIDs;
comm.Parameters.Add("@name", SqlDbType.Int);
comm.Parameters["@name"].Value = Name;
Wo
- CategoryIDs ist eine durch Kommata getrennte Liste von zahlen "123,456,789" (ohne Anführungszeichen)
- Name ist eine Zeichenkette, gegebenenfalls mit single-quotes und andere schlechte Zeichen
Was ist die richtige syntax dafür?
InformationsquelleAutor der Frage Tom Ritter | 2008-11-19
Du musst angemeldet sein, um einen Kommentar abzugeben.
Lassen Sie uns sagen, dass Sie Ihre Kategorie-ids in ein integer-array und der Name ist ein string. Der trick ist, erstellen Sie den Befehl text, um Ihnen zu erlauben, geben Sie Ihr die ids der Kategorien als einzelne Parameter und erstellen der fuzzy-match für den Namen. Zu tun, die ehemaligen, verwenden wir eine Schleife konstruieren einer Folge von parameter-Namen @p0 durch @pN-1, wobei N die Anzahl von Kategorie-ids im array. Dann konstruieren wir einen parameter, und fügen Sie es dem Befehl mit der zugehörigen Kategorie-id als Wert für jede benannte parameter. Dann verwenden wir die Verkettung auf den Namen in der Abfrage selbst zu ermöglichen die fuzzy-Suche auf name.
Dies ist eine voll parametrisierte Abfrage, die machen Sie Ihren DBA glücklich. Ich vermute, dass da diese ganzen zahlen, aber es würde nicht viel von einem Sicherheitsrisiko einfach zu konstruieren den Befehl text direkt mit den Werten, während noch die Parametrierung der name. Wenn Ihr die ids der Kategorien werden in ein string-array, teilt das array auf Kommas, konvertieren jeweils eine ganze Zahl und speichern Sie in das integer-array.
Hinweis: ich sagen-array und verwenden Sie es in dem Beispiel, aber es sollte funktionieren für jede Sammlung, obwohl Ihr iteration wird wahrscheinlich abweichen.
Ursprüngliche Idee von http://www.tek-tips.com/viewthread.cfm?qid=1502614&page=9
InformationsquelleAutor der Antwort tvanfosson
Müssen Sie "%" im Wert von sql-parameter.
InformationsquelleAutor der Antwort TcKs
Dieser Ansatz wird nicht funktionieren. Zeitraum.
IN der Klausel erwartet eine Liste der Parameter selbst, so dass, wenn Sie bind eine parameter haben Sie die chance zum pass in eine Wert.
Bauen Sie Ihre Anweisung string dynamisch, mit den genauen Betrag der einzelnen IN Klausel Platzhalter, die Sie beabsichtigen, zu übergeben, und dann fügen Sie Parameter hinzu, und binden die Werte in einer Schleife.
InformationsquelleAutor der Antwort Tomalak
nicht sicher, ob dies der richtige Weg ist, aber es ist ein Weg, ich habe es getan in der Vor
Liste templist = new list
comm.Parameter.Add("@categoryids", SqlDbType.varchar);
comm.Parameters["@categoryids"].Wert = Zeichenkette.join(",",templist.toarray())
InformationsquelleAutor der Antwort B.A.Hammer