【问题标题】:Incorrect syntax near 's'. Unclosed quotation mark after the character string's' 附近的语法不正确。字符串后的非闭合引号
【发布时间】:2014-08-29 17:44:59
【问题描述】:

我正在使用查询从 SQL 数据库中提取数据,有时我用来获取我正在寻找的记录的最后一个下拉列表有一个单引号,当它出现时我收到以下错误:附近语法不正确'的'。字符串后的非右引号

这是我的代码:

Using objcommand As New SqlCommand("", G3SqlConnection)
        Dim DS01 As String = DDLDS01.SelectedItem.Text
        Dim State As String = DDLState.SelectedItem.Text
        Dim Council As String = DDLCouncil.SelectedItem.Text
        Dim Local As String = DDLLocal.SelectedItem.Text

        Dim objParam As SqlParameter
        Dim objDataReader As SqlDataReader
        Dim strSelect As String = "SELECT * " & _
            "FROM ConstitutionsDAT " & _
            "WHERE DS01 = '" & DS01 & "' AND STATE = '" & State & "' AND COUNCIL = '" & Council & "' AND LOCAL = '" & Local & "' AND JURISDICTION = '" & DDLJurisdiction.SelectedItem.Text & "' "

        strSelect.ToString.Replace("'", "''")
        objcommand.CommandType = CommandType.Text
        objcommand.CommandText = strSelect


        Try

            objDataReader = objcommand.ExecuteReader
            DDLJurisdiction.Items.Add("")
            While objDataReader.Read()
                If Not IsDBNull(objDataReader("SUBUNIT")) Then
                    txtSubUnit.Text = (objDataReader("SUBUNIT"))
                End If

                If Not IsDBNull(objDataReader("DS02")) Then
                    lblDS02.Text = (objDataReader("DS02"))
                End If
                If Not IsDBNull(objDataReader("LEGISLATIVE_DISTRICT")) Then
                    txtALD.Text = (objDataReader("LEGISLATIVE_DISTRICT"))
                End If
                If Not IsDBNull(objDataReader("REGION")) Then
                    txtRegion.Text = (objDataReader("REGION"))
                End If
                If DDLState.SelectedItem.Text <> "OTHER" Then
                    If Not IsDBNull(objDataReader("UNIT_CODE")) Then
                        txtUnitCode.Text = (objDataReader("UNIT_CODE"))
                    End If
                End If                   
            End While
            objDataReader.Close()
        Catch objError As Exception
            OutError.Text = "Error: " & objError.Message & objError.Source
            Exit Sub
        End Try
    End Using

并非所有记录都包含单引号,只有一些,所以我需要一些可以在单引号存在或不存在时起作用的东西。 谢谢。

【问题讨论】:

    标签: sql vba


    【解决方案1】:

    你的问题是这里的这一行:

    strSelect.ToString.Replace("'", "''")
    

    这会改变你的 WHERE 子句,比如

    WHERE DS01 = 'asdf' AND ...
    

    收件人:

    WHERE DS01 = ''asdf'' AND ...
    

    您需要替换 where 子句中的单个值,而不是整个 select 语句。

    您真正应该做的是改用parameterized query

    更新:添加了与 aquinas 相同的链接,因为它是一个很好的链接

    【讨论】:

    • 我什至想告诉别人如何通过转义字符来“修复”查询,就像有人来找你说:“我头疼。我在找锤子砸我的头骨在,你看到了吗。” “哦,是的!就在那边。”而不是仅仅说:“不!停止!拿一些泰诺。” :)
    • @aquinas 够公平的。但我仍然想指出如何解决他们所拥有的问题,然后指出还有更好的方法,因为我也想回答他们提出的问题。
    • 即使在我删除了替换字符串之后,我仍然收到此错误。我只是在网上搜索答案后才包含它。如果我直接转到 SQL 表并从记录中删除单引号,则查询工作正常,只有当文本包含 's...
    • @user3991041 您必须对每个变量进行替换,DS01StateCouncil 等。但是,正如建议的那样,您应该使用参数化查询,以便您不必进行此类替换。
    • 根据您上面的回答,我已经找到了解决方案,谢谢。而不是将替换放在整行上,我只将它添加到具有单引号的字段中。一旦我完成了这个项目,我将考虑使用参数化查询,它让我整个夏天都很忙,但几乎完成了。这似乎很重要...再次感谢您的帮助。
    【解决方案2】:

    使用参数化查询,并且永远只使用参数化查询。见:How do I create a parameterized SQL query? Why Should I?

    【讨论】:

      猜你喜欢
      • 2023-03-25
      • 1970-01-01
      • 2015-03-20
      • 2011-02-10
      • 1970-01-01
      • 2015-07-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多