转义不需要的字符,主要是单引号 - 替换功能和实现

时间:2012-07-10 14:57:49

标签: ms-access vba

我只是在测试我的数据库,我意识到只要我的数据库中的文本条目包含'字符(单引号),我就会遇到问题。我现在的解决方案是,在字符串上的任何.execute操作之前,我调用escape(string, "'", " "'" ")

以下摘要示例:

qr = "INSERT INTO tblExample VALUES ( " & "'" & me.testparam & "'" & ");"
qr = Replace(qr, "'", " "'" ")
db.execute qr
'also tried  qr = "INSERT INTO tblExample VALUES ( " & "'" & replace(me.testparam,"'"," ") & "'" & ");"

我认为这是防止Tourette's等值出错的正确解决方法。

这有两个问题。首先,它不起作用。其次,我在我的应用程序中的代码中有50多个位置,我在其中调用语句db.execute qr,其中qr是一个可能包含单引号的字符串。我需要表中的字段来包含单引号,所以我不能用空格或类似的东西替换它。

两部分问题:

  1. 有没有比在我要作为查询执行的每个字符串上调用Replace的所有代码更好的解决方案?

  2. 为什么我当前的实施失败了? - 即使将单引号转义为空格,我仍然会在查询表达式中出现语法错误。

3 个答案:

答案 0 :(得分:4)

首先检查这两行。

"VALUES ( " & "'" & me.testparam & "'" & ");"
"VALUES ( '" & me.testparam & "');"

两者都会产生完全相同的字符串。对我来说,不同的是我的大脑更快地理解了第二个版本。

现在,以下是评论告诉您的操作...用两个单引号替换源字符串中的每个单引号。我添加了Debug.Print,因此您可以在立即窗口中查看已完成的字符串(使用Ctrl + g进行操作)...然后您可以看到实际的字符串,而不是试图想象它的样子。

qr = "INSERT INTO tblExample VALUES ( '" & _
    Replace(Me.testparam, "'", "''" & "');"
Debug.Print qr
db.Execute qr, dbFailOnError 

由于我假设dbDAO.Database对象变量,因此我添加了dbFailOnError选项。您应该在代码中包含一个错误处理程序,以处理dbFailOnError公开的任何问题。

当您在查询中遇到VBA函数问题时,请转到立即窗口并在那里测试您的函数表达式。这个触发编译错误,“预期:列表分隔符或)”:

? Replace("Tourette's", "'", " "'" ")

但是这个有效:

? Replace("Tourette's", "'", "''")
Tourette''s

我提到过,因为它一般很有用,也因为你的标题以“转义不需要的字符,主要是单引号”开头。因此,如果要删除/替换其他字符,而不仅仅是单引号,请在“立即”窗口中进行实验,直到找到有效的Replace()表达式。然后在查询中使用该表达式。

例如,如果不需要的字符包含换行符......

MyString = "foo" & vbCrlf & "bar" : ? MyString
foo
bar
? Replace(MyString, Chr(13) & Chr(10), " ")
foo bar

注意:我使用Chr(13) & Chr(10)而不是vbCrlf作为查找目标,因为数据库引擎可以使用Chr()函数但不知道命名常量({{1} })。

答案 1 :(得分:2)

您的查询失败,因为您尚未说明要插入的位置:

Dim qd As QueryDef
qr = "INSERT INTO tblExample (AText) VALUES ( [avalue] );"

Set qd = CurrentDB.CreateQueryDef("",qr)
qd.Parameters("avalue").Value = me.testparam
qd.Execute dbFailOnError

答案 2 :(得分:1)

另一种方法是将引用定义为常量(Const Quote =“”“”)并使用它来构建SQL语句。不可能将引号定义为Const Quote = Chr(34),因为常量定义不能基于函数,因此必须在一行中使用四个双引号。第三个引用是你要保存的,第二个引用是为了超越第三个引用而第一个和最后一个引用是因为你要分配的值是一个字符串。

然后,您将能够构建SQL语句,例如:

SQL = SELECT * FROM tblSyndromes
WHERE Syndrome = " & Quote & "Tourette's" & Quote & ";"

数据中有单引号将不再重要。

我不使用参数,就好像我将我的数据库升级到sql server并将我的查询转换为传递查询,我不能使用参数。我很少高档,但我用这个假设编写了所有代码。此外,如果您的查询没有按预期工作,如何找出问题所在。如果我有一个名为SQL的变量,那么我总是可以打印SQL语句并在新查询中运行它以查看它的作用。