2012-05-29 123 views
3

我正在写一个函数,从一个列表框中选取多个选定的项并将值传递给一个SQL查询,以便在从另一个表中选择过滤值后将值插入到表中。我已经输入的代码如下,它似乎并没有工作(问题是我传递字符串到查询的方式。传递C#字符串作为SELECT参数的SQL参数

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 + "', "; 
      } 
     } 
    } 
} 
+1

您的代码称为SQL注入一个严重的安全问题 - 请在参数化查询,阅读起来...... – Yahia

+0

你的LINQ和Lambda技术看起来不错(不确定你的SQL寿命),为什么你不去LINQ to SQL选项? –

回答

0

lbSites的值丢失每次您发布背部,保持它在你的浏览状态。

此外,你不需要command.Parameters.AddWithValue("@lbSites", lbSites);因为有您的SQL没有@lbSites参数。

3

你不应该直接传递这样的价值观SQL,因为它让你在打开的SQL注入攻击。

取而代之,您可以计算出需要的参数数量,然后将这些参数名称插入到查询中。

这种方法最多可以处理大约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]); 
} 
+0

谢谢@威尔休斯,这正是我一直在寻找的 –

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+ ',%' 
相关问题