Domanda

Le query con parametri in .Net appaiono sempre così negli esempi:

SqlCommand comm = new SqlCommand(@"
   SELECT * 
   FROM   Products 
   WHERE  Category_ID = @categoryid
", 
   conn);
comm.Parameters.Add("@categoryid", SqlDbType.Int);
comm.Parameters["@categoryid"].Value = CategoryID;

Ma sto incontrando un muro di mattoni nel tentativo di fare quanto segue:

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;

Dove

  • IDCategoria è un elenco di numeri separato da virgole "123.456.789" (senza virgolette)
  • Il nome è una stringa, possibilmente con virgolette singole e altri caratteri non validi

Qual è la sintassi giusta per questo?

È stato utile?

Soluzione

Supponiamo che tu abbia i tuoi ID categoria in un array intero e Nome è una stringa. Il trucco è creare il testo del comando per permetterti di inserire tutti i tuoi ID categoria come parametri individuali e costruire la corrispondenza fuzzy per nome. Per fare il primo, usiamo un ciclo per costruire una sequenza di nomi di parametri da @ p0 a @ pN-1 dove N è il numero di ID di categoria nell'array. Quindi costruiamo un parametro e lo aggiungiamo al comando con l'id di categoria associato come valore per ciascun parametro denominato. Quindi utilizziamo la concatenazione sul nome nella query stessa per consentire la ricerca fuzzy sul nome.

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",<*>quot;%{Name}%");
comm.CommandText = "SELECT * FROM Products WHERE Category_ID IN (";
comm.CommandText += string.Join(",", parameters) + ")";
comm.CommandText += " OR name LIKE @name";

Questa è una query completamente parametrizzata che dovrebbe rendere felice il tuo DBA. Ho il sospetto che dal momento che questi sono numeri interi, anche se non sarebbe un grosso rischio per la sicurezza solo costruire il testo del comando direttamente con i valori, pur continuando a parametrizzare il nome. Se gli ID di categoria si trovano in una matrice di stringhe, basta dividere la matrice in virgole, convertirle ognuna in un numero intero e memorizzarlo nella matrice di numeri interi.

Nota: dico array e lo uso nell'esempio, ma dovrebbe funzionare per qualsiasi raccolta, anche se la tua iterazione sarà probabilmente diversa.

Idea originale da http://www.tek-tips.com /viewthread.cfm?qid=1502614&page=9

Altri suggerimenti

È necessario "% " in valore del parametro sql.

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 + "%";

Questo approccio non funzionerà. Periodo.

La clausola IN prevede un elenco di parametri stessi, quindi quando si collega un parametro, si ha la possibilità di passare un valore.

Costruisci la stringa di istruzione in modo dinamico, con la quantità esatta di singoli segnaposto della clausola IN che intendi trasferire, quindi aggiungi parametri e associa loro i valori in un ciclo.

non sono sicuro che questo sia il modo giusto, ma è un modo in cui l'ho fatto in Prima

list templist = new list

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top