我正在编写一个函数,从Listbox中获取多个选定项,并在从另一个表中选择过滤后的值后,将vaules传递给SQL Query以将值插入表中。我输入的代码如下所示,它似乎不起作用(问题在于我将字符串传递给查询的方式。
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 + "', ";
}
}
}
}
答案 0 :(得分:3)
您不应该直接将这样的值传递给SQL,因为它会让您对SQL注入攻击持开放态度。
相反,您可以确定需要多少参数,然后将这些参数 names 插入到查询中。
此方法最多可用于2,000个值(假设SQL Server)。如果需要传递更多值,则需要将查询分解为子集,或使用参数值表。
示例(未经测试,因此可能存在一些错误):
// 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]);
}
答案 1 :(得分:0)
每次发布回来时lbSites
的值都会丢失。将它保存在ViewState中。
此外,您不需要command.Parameters.AddWithValue("@lbSites", lbSites);
,因为您的sql中没有@lbSites
参数。
答案 2 :(得分:0)
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+ ',%'