2

我正在研究一些遗留的 VB 6.0 代码(Access XP 应用程序)来解决 Access 应用程序的 SQL 语句问题。对于客户名称中包含撇号的情况(例如“医生手术”),我需要使用 2 个单引号替换单引号:

Replace(customerName, "'", "''")

这将转义单引号,所以我得到了有效的 SQL:

SELECT blah FROM blah WHERE customer = 'Doctor''s Surgery'

不幸的是,替换函数会导致无限循环和堆栈溢出,大概是因为它替换函数递归地将每个添加的引号转换为另外 2 个引号。例如,一个引号被替换为两个,然后第二个引号也被替换为两个,依此类推......

- - - - - - - - 编辑 - - - - - - - -

我注意到(感谢海报)这个项目中使用的替换功能是自定义编写的:

Public Function replace(ByVal StringToSearch As String, ByVal ToLookFor As String,
ByVal ToReplaceWith As String) As String
Dim found As Boolean
Dim position As Integer
Dim result As String

position = 0
position = InStr(StringToSearch, ToLookFor)
If position = 0 Then
    found = False
    replace = StringToSearch
    Exit Function
Else
    result = Left(StringToSearch, position - 1)
    result = result & ToReplaceWith
    result = result & Right(StringToSearch, Len(StringToSearch) - position - Len(ToLookFor) + 1)
    result = replace(result, ToLookFor, ToReplaceWith)
End If
replace = result

End Function

显然,VB 并不总是有它自己的替换功能。这个实现一定是有缺陷的。将遵循人们的建议并将其删除以支持 VB 6 的实现 - 如果这不起作用,我将编写我自己的方法。谢谢各位的意见!

4

3 回答 3

8

您确定它不是 Replace 函数的专有实现吗?

如果是这样,它可以被 VB6 的 Replace 替换。

我不记得它出现在哪个版本中(不是在 Vb3 中,而是在 VB6 中),所以如果原始代码库是 vb3/4,它可能是手动编码的版本。

编辑

我刚刚看到你的编辑,我是对的!

是的,您应该能够只删除该功能,然后它将使用内置 VB6 替换功能。

于 2009-06-17T15:36:09.560 回答
2

我们使用一个 VB6 应用程序,它可以选择将 ' 替换为 ` 或完全删除它们。

您还可以遍历这些字母,构建第二个字符串并将每个 ' 作为 '' 插入。

于 2009-06-17T15:17:38.460 回答
2

我刚刚在 Access 中尝试过,它工作正常(没有 stackoverflow):

 Public Function ReplaceSingleQuote(tst As String) As String
        ReplaceSingleQuote = Replace(tst, "'", "''")
 End Function


 Public Sub TestReplaceSingleQuote()
        Debug.Print ReplaceSingleQuote("Doctor's Surgery")
 End Sub
于 2009-06-17T15:29:46.780 回答