我的一位同事创建了一个程序,该程序读取文本文件并将其中的各种值分配给SQL语句中使用的变量。
其中一个变量gsAccounts
是一个字符串变量。
使用字符串构建器,正在使用SELECT
构建sql.append
语句。在字符串的末尾,有以下行:
sql.Append(" WHERE L.Account_Code IN(" & gsAccounts & ")"
我遇到的问题是有时候并非总是如此gsAccounts
(帐户代码列表)可能包含带撇号的帐户代码,因此查询变为
"WHERE L.Account_Code IN('test'123')"
帐户代码为test'123
我尝试使用双引号以"WHERE L.Account_Code IN("""" & gsAccounts & """")"
方式绕过它(使用4和6“彼此相邻,但都没有用)
我该如何解决这个问题? account_Code是表中的主键,因此我不能删除它,因为有多年的交易和数据连接到它。
答案 0 :(得分:1)
我在10年前发布了以下示例here,几乎到了今天。 (哎呀!以为是6月5日,但那是10月5日。然后是10。5年。)
Dim connection As New SqlConnection("connection string here")
Dim command As New SqlCommand
Dim query As New StringBuilder("SELECT * FROM MyTable")
Select Case Me.ListBox1.SelectedItems.Count
Case 1
'Only one item is selected so we only need one parameter.
query.Append(" WHERE MyColumn = @MyColumn")
command.Parameters.AddWithValue("@MyColumn", Me.ListBox1.SelectedItem)
Case Is > 1
'Multiple items are selected so include a parameter for each.
query.Append(" WHERE MyColumn IN (")
Dim paramName As String
For index As Integer = 0 To Me.ListBox1.SelectedItems.Count - 1 Step 1
'Name all parameters for the column with a numeric suffix.
paramName = "@MyColumn" & index
'Add a comma before all but the first value.
If index > 0 Then
query.Append(", ")
End If
'Append the placeholder to the SQL and add the parameter to the command
query.Append(paramName)
command.Parameters.AddWithValue(paramName, Me.ListBox1.SelectedItems(index))
Next index
query.Append(")")
End Select
command.CommandText = query.ToString()
command.Connection = connection
答案 1 :(得分:0)
单引号可以通过使它们成双引号来“转义”。例如。 '
变为''
。
然而,由于SQL注入的高风险,这种方法通常不推荐 - 这是一个非常危险和普遍的问题。请参阅:https://www.owasp.org/index.php/SQL_Injection
为了避免这种情况,大多数库将包含某种类型的转义机制,包括在Java世界中使用诸如预处理语句之类的东西。在.net世界中,这可能有用:https://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcommand.prepare(v=vs.110).aspx
答案 2 :(得分:0)
如果您只有一个字段,这是最简单的解决方案
Private Function gsAccountsConvert(ByVal gsAccounts As String)
Dim gsAccountsString As String = ""
Dim StringTemp
StringTemp = gsAccounts.Split(",")
Dim i As Integer
For i = 0 To UBound(StringTemp)
StringTemp(i) = StringTemp(i).ToString.Trim
If StringTemp(i) <> "" Then
If StringTemp(i).ToString.Substring(0, 1) = "'" Then
StringTemp(i) = """" & StringTemp(i).ToString.Substring(1, Len(StringTemp(i).ToString) - 2) & """"
End If
End If
If i <> UBound(StringTemp) Then
gsAccountsString = gsAccountsString & StringTemp(i).ToString.Replace("'", "''") & ","
Else
gsAccountsString = gsAccountsString & StringTemp(i).ToString.Replace("'", "''") & ""
End If
Next
gsAccountsString = gsAccountsString.Replace("""", "'")
Return gsAccountsString
End Function