Frage

parametrisierte Abfragen in .Net sehen immer so 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 laufe in eine Mauer versucht, die 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 „123456789“ (ohne Anführungszeichen)
  • Name ist eine Zeichenfolge, die möglicherweise mit einfachen Anführungszeichen und anderen schlechten Zeichen

Was ist die richtige Syntax für das?

War es hilfreich?

Lösung

Lassen Sie uns sagen, dass Sie Ihre Kategorie-IDs in einem Integer-Array und Name ist ein String. Der Trick ist, den Befehlstext zu erstellen, damit Sie alle Ihre Kategorie-IDs als einzelne Parameter und konstruieren die Fuzzy-Match für Namen einzugeben. Um die frühere zu tun, verwenden wir eine Schleife eine Sequenz von Parameternamen zu konstruieren @ @ p0 bis pN-1, wobei N die Anzahl der Klassen-IDs in dem Array ist. Dann bauen wir einen Parameter, und fügen Sie den Befehl mit der zugehörigen Kategorie-ID als Wert für jeden benannten Parameter. Dann benutzen wir Verkettung auf den Namen in der Abfrage selbst die Fuzzy-Suche auf den Namen zu ermöglichen.

string Name = "someone";
int[] categoryIDs = new int[] { 238, 1138, 1615, 1616, 1617,
                                1618, 1619, 1620, 1951, 1952,
                                1953, 1954, 1955, 1972, 2022 };

SqlCommand comm = conn.CreateCommand();

string[] parameters = new string[categoryIDs.Length];
for(int i=0;i<categoryIDs.Length;i++)
{
   parameters[i] = "@p"+i;
   comm.Parameters.AddWithValue(parameters[i], categoryIDs[i]);
}
comm.Parameters.AddWithValue("@name",$"%{Name}%");
comm.CommandText = "SELECT * FROM Products WHERE Category_ID IN (";
comm.CommandText += string.Join(",", parameters) + ")";
comm.CommandText += " OR name LIKE @name";

Dies ist eine voll parametrisierte Abfrage, die Ihren DBA glücklich machen sollte. Ich vermute, dass da diese Zahlen sind, obwohl sie nicht nur viel von einem Sicherheitsrisiko darstellen würden den Befehl Text direkt mit den Werten zu konstruieren, während immer noch den Namen Parametrisierung. Wenn Ihre Kategorie-IDs in einem String-Array ist, teilt nur das Array auf Kommas, konvertiert jeweils auf eine ganze Zahl, und speichern sie in dem Integer-Array.

Hinweis: , sage ich und Array es in dem Beispiel verwendet werden, aber es sollte für jede Sammlung arbeiten, obwohl Ihre Iteration wahrscheinlich abweichen

.

Ursprüngliche Idee von http://www.tek-tips.com /viewthread.cfm?qid=1502614&page=9

Andere Tipps

Sie müssen "%" in Wert von SQL-Parameter.

SqlCommand comm = new SqlCommand("SELECT * FROM Products WHERE Category_ID IN (@categoryid1, @categoryid2) OR name LIKE @name", conn);
comm.Parameters.Add("@categoryid1", SqlDbType.Int);
comm.Parameters["@categoryid1"].Value = CategoryID[0];
comm.Parameters.Add("@categoryid2", SqlDbType.Int);
comm.Parameters["@categoryid2"].Value = CategoryID[1];
comm.Parameters.Add("@name", SqlDbType.Int);
comm.Parameters["@name"].Value = "%" + Name + "%";

Dieser Ansatz wird nicht funktionieren. Period.

Die IN-Klausel erwartet eine Liste von Parametern selbst, also, wenn Sie binden ein Parameter, um es, Sie haben die Chance, in weitergeben ein Wert.

Erstellen Sie Ihre Anweisung Zeichenfolge dynamisch, mit der genauen Menge der einzelnen IN-Klausel Platzhalter Sie beabsichtigen, in zu übergeben, und fügen Sie dann Parameter und binden Werte, um sie in einer Schleife.

nicht sicher, ob dies der richtige Weg ist, aber es ist eine Art, wie ich es in dem getan habe, bevor

Liste templist = neue Liste

comm.Parameters.Add ( "@ categoryids", SqlDbType.varchar); comm.Parameters [ "@ categoryids"]. value = string.join ( "", templist.toarray ())

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top