2014-04-04 135 views
0

我正在使用复选框列表来选择要导出的订单,并且我正在使用以下命令导出订单我的问题是我如何使用下面的代码在声明中放置chracher?动态声明

For Each obj As Object In CheckedListBox1.CheckedItems 
     tempstring = Chr(39) & obj.ToString() & Chr(39) 
     sb.AppendLine(String.Join(",", tempstring) 
    Next 

函数返回SQL

Friend Function GetDistinctOrdersForLocations(OrderNumber As String) As String Implements 
    iScriptBuilder.GetDistinctOrdersForLocations 
    Dim retVal As String = "SELECT DISTINCT location, ordernumber FROM orders " 
    retVal &= "where orders.ordernumber in (" & OrderNumber & ")" 
    Return retVal 
    End Function 

这是通过上述功能

SELECT DISTINCT location, ordernumber FROM orders where orders.ordernumber 
in ('Puals Test V1' 
'Puals Test V2' 

) 
+0

要小心这种方法,如果你的一个字符串包含'你会遇到麻烦。 –

+0

@the_lotus它不会过滤产品编号 – rogue39nin

回答

0

当然它确实中生产这种SQL。您通过在单引号中引用object.ToString()来创建tempstring。然后将其添加到StringBuilder而没有任何更改,因为String.Join不会为一个字符串做任何事情。 String.Join使用分隔符将字符串列表连接在一起,但是您没有传入列表,而只是传递一个字符串 - 这里没有任何内容。

你需要做的是

For Each obj As Object In CheckedListBox1.CheckedItems 
    tempstring = Chr(39) & obj.ToString() & Chr(39) 
    If sb.Length > 0 THEN 
     sb.Append(",") 
    End If 
    sb.Append(tempstring) 
Next 

这追加一个逗号的StringBuilder的情况下,有一些内容已经然后追加新的字符串。

0

使用内置功能:

retVal &= string.Join(
    ",", 
    CheckedListBox1.CheckedItems 
     .Select(x => string.Format("'{0}'", x.ToString()))); 

做这样的结构时,也注意SQL注入。将它移动到存储过程或传递可变数量的预准备语句可能会更安全。

请检查this answer以获得更安全的方式来实现您的目标。