Запрос SELECT для строителя строк, когда переменная имеет апостроф - PullRequest
0 голосов
/ 07 июня 2018

Мой коллега создал программу, которая читает текстовый файл и присваивает различные значения из него переменным, которые используются в инструкциях 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 голосов
/ 07 июня 2018

Если у вас есть только один с полем, это самое простое решение

    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
0 голосов
/ 07 июня 2018

Я разместил следующий пример здесь 10 лет назад, почти до сегодняшнего дня.(Упс! Думал, что это 5 июня, но это было 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
0 голосов
/ 07 июня 2018

Одиночные кавычки можно «избежать», сделав их двойными одинарными кавычками.Например, ' становится ''.

Однако этот подход обычно не рекомендуется из-за высокого риска внедрения 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

...