字符串构建器变量具有撇号时的SELECT查询

时间:2018-06-07 09:30:24

标签: sql vb.net stringbuilder

我的一位同事创建了一个程序,该程序读取文本文件并将其中的各种值分配给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是表中的主键,因此我不能删除它,因为有多年的交易和数据连接到它。

3 个答案:

答案 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