c# sql-server-2008 listbox where-in

Pasando C#String como parámetro de SQL para SELECCIONAR DONDE EN



sql-server-2008 listbox (3)

Estoy escribiendo una función para tomar tantos elementos seleccionados múltiples de un Listbox y pasar los vaules a SQL Query para INSERTAR valores en una tabla después de seleccionar los valores filtrados de otra tabla. El código que he tipeado está debajo y no parece funcionar (el problema está en la forma en que estoy pasando la cadena a la consulta).

string lbSites = ""; protected void Button1_Click1(object sender, EventArgs e) { string cns = "server=abc;database=testDB;Trusted_Connection=True"; using (SqlConnection con = new SqlConnection(cns)) { using (SqlCommand command = con.CreateCommand()) { command.CommandText = "INSERT INTO Activity (Hostname,Site,Status,System_Dept,Business_Dept)" + "SELECT * FROM Inventory WHERE Site IN ("+lbSites+");" ; con.Open(); command.Parameters.AddWithValue("@lbSites", lbSites); command.ExecuteNonQuery(); con.Close(); } } } protected void ListBox1_SelectedIndexChanged(object sender, EventArgs e) { if (ListBox1.Items.Count > 0) { for (int i = 0; i < ListBox1.Items.Count; i++) { if (ListBox1.Items[i].Selected) { lbSites += "''" + ListBox1.Items[i].Value + "'', "; } } } }


El valor de lbSites se pierde cada vez que publica contenido. Guárdelo en su ViewState.

Además, no necesita command.Parameters.AddWithValue("@lbSites", lbSites); ya que no hay @lbSites parámetro @lbSites en su sql.


No debe pasar directamente valores como este a SQL, ya que lo deja abierto a un ataque de inyección SQL.

En cambio, puede averiguar cuántos parámetros necesita y luego insertar esos nombres de parámetros en su consulta.

Este enfoque funcionará para aproximadamente 2,000 valores (suponiendo SQL Server). Si necesita pasar más valores, deberá dividir las consultas en subconjuntos o usar tablas de parámetros y valores.

Ejemplo (no probado, por lo que puede tener algunos errores):

// Get your selected items: var items = ListBox1.Items.Where(i=>i.Selected).Select(i=>i.Value).ToArray(); // Create a series of parameters @param0, @param1, @param2..N for each value. string paramNames = string.Join(", ", Enumerable.Range(0,items.Count()).Select(e=>"@param"+e)); // Build the command text and insert the parameter names. string commandText = "INSERT INTO Activity (Hostname,Site,Status,System_Dept,Business_Dept)" + "SELECT * FROM Inventory WHERE Site IN ("+ paramNames +")"; command.CommandText = commandText; // Now add your parameter values: this binds @param0..N to the values selected. for(int param=0;param<items.Count();param++) { command.Parameters.AddWithValue("@param" + param, items[param]); }


try this SELECT M.REG_NO, T.TYPE_ID FROM MAIN AS M INNER JOIN CLASSIFICATION AS C ON M.REG_NO = C.REG_NO INNER JOIN TYPE AS T ON T.TYPE_ID = C.TYPE_ID WHERE (@Types) like .LIKE ''%,'' +T.TYPE_ID+ '',%''