SQL Server 使用单引号对来标识字符串的开头和结尾。将“Mrs Brown's Boys”插入数据库表会失败,因为三个单引号表示两个字符串,其中一个不完整。 Brown 后面的撇号需要转义字符。本文探讨了如何使用自定义 VBA 函数来解决此问题。
本文假定读者已显示开发人员功能区并且熟悉 VBA 编辑器。 如果没有,请谷歌“Excel Developer Tab”或“Excel Code Window”。
这里的“数据库”一词适用于“工业级”数据库,例如 SQL Server 以及 Oracle。
可以找到本练习中使用的工作簿示例 开始.
SQL 字符串
在 SQL 语句中包含撇号(或单引号)会导致数据库管理器返回以下错误(在本例中,名称为 O'Dowd):
需要一个转义字符,即双撇号而不是单撇号。因此,O”Dowd 可以被数据库接受,而 O'Dowd 则不能。
功能
如果捕获字段可能包含撇号,则可以构建一个自定义函数,在更新之前触发该函数,将单引号替换为双引号。
- 打开一个新的工作簿;
- 将第一个工作表命名为“更新”并按如下方式完成,使用您自己的数据库名称等。这些字段将用于构建连接字符串以 SQL Server.
- 打开代码窗口并插入一个模块。使用菜单项“工具”>“引用”来引用 ADO 库。
将下面的代码复制到模块中。 这连接到数据库。
Public connDB As New ADODB.Connection Public rs As New ADODB.Recordset Public strSQL As String Public strCriteria As String Sub ConnectDatabase() 如果 connDB.State = 1 Then connDB.Close On Error GoTo ErrConnect Dim strServer, strDBase, strUser, strPWD As String strServer = Sheets("更新").Range("B2") strDBase = Sheets("更新").Range("B3") strUser = Sheets("更新").Range("B4") strPWD = Sheets(" Update").Range("B5") 如果 strPWD > "" Then strConnectionstring = "DRIVER={SQL Server};Server=" & strServer & ";Database=" & strDBase & ";Uid=" & strUser & ";Pwd=" & strPWD & ";Connection Timeout=30;" Else strConnectionstring = "DRIVER={SQL Server};SERVER=" & strServer & ";Trusted_Connection=yes;DATABASE=" & strDBase 'Windows authentication End If connDB.ConnectionTimeout = 30 connDB.Open strConnectionstring Exit Sub ErrConnect: MsgBox Err.Description End Sub
- 将函数添加到模块中:
函数 fRemoveApostrophe(strWord As String) Dim n As Integer Dim x As Integer x = 0 For n = 0 To 100 x = InStr(x + 2, strWord, "'") '查找撇号的位置 If x = 0 Then Exit For If x > 0 Then strWord = Left(strWord, x - 1) & Chr(39) & Chr(39) & Right(strWord, Len(strWord) - (x)) End If Next n fRemoveApostrophe = strWord End Function
- 忽略函数。
Sub IgnoreFunction() Call ConnectDatabase strCriteria = Sheets("Update").Range("B10") strSQL = "Insert into tblCrewMember (LastName) values ('" & strCriteria & "')" MsgBox strSQL & ". 此 SQL 条目将失败;请注意三个撇号。" Debug.Print strSQL 'connDB.Execute (strSQL) End Sub
- 使用功能
Sub UseFunction() Call ConnectDatabase strCriteria = Sheets("Update").Range("B15") strCriteria = fRemoveApostrophe(strCriteria) strSQL = "Insert into tblCrewMember (LastName) values ('" & strCriteria & "')" MsgBox strSQL & ". 此 SQL 条目将成功执行,并在数据表中显示为 O'Dowd。" Debug.Print strSQL 'connDB.Execute (strSQL) End Sub
- 完成 更新 工作表如下所示,从单元格开始 A8:
- 将按钮分配给宏 忽略函数 和 使用函数 分别
结果
一个消息框将显示结果; 在此练习中没有物理更新数据库,但如果您希望这样做,请确保字段名称与您的数据库兼容,并添加使用 VBA 语句 conndb.execute(strSQL)
从 Excel 崩溃中恢复
当电脑资源不足时,Excel 很容易崩溃。在编写本练习的过程中,Excel 的电子表格(尚未保存)卡住了。代码窗口部分响应正常,允许我关闭整个工作簿。结果证明,工作簿可以正常重新打开,内容和代码也都完整无缺。如果临时文件和源文件(这种情况太常见了)损坏,那么在没有工具修复的情况下,这项工作就不得不重做。 xlsx损坏. 在这种情况下意义不大,但对于较大的工作簿来说可能是一场潜在的灾难。
作者简介:
Felix Hooker 是一位数据恢复专家 DataNumen, Inc.,它是数据恢复技术领域的世界领先者,包括 恢复rar文件 和sql恢复软件产品。 欲了解更多信息,请访问 datanumen.com


