ADODB Execute方法执行SQL查询时触发运行时错误求助
问题描述
在Excel VBA中查询Access数据库时,执行SELECT * FROM LL_domain可正常运行,但执行SELECT * FROM LL_domain WHERE domain = 'de'时触发ADODB运行时错误。该查询直接在Access查询窗口中可正常执行,更换ADODB连接的提供者后问题仍存在。
相关代码片段:
Function foo (ByRef dBase as Object) as Boolean Dim myConn2 as Object Set myConn2 = CN.getCN_Ace16(dBase.fileDB.path) Me.marketID = getMarketID(myConn2) End Function Function getCN_Ace16(ByVal dbPath As String) As Object Set getCN_Ace16 = CreateObject("ADODB.Connection") getCN_Ace16.connectionString = "Provider=Microsoft.ACE.OLEDB.16.0;Data Source=" & dbPath End Function Function getMarketID(ByRef myConn As Object) As String Dim RS As Object myConn.Open Set RS = myConn.Execute("SELECT * FROM LL_domain WHERE domain = 'de'") ...... End Function
可能的原因及解决方法
字段名
domain是Access保留字
Access的保留字列表包含domain,ADODB驱动解析SQL时,未转义的保留字会触发语法错误(Access查询窗口会自动处理转义,所以能正常执行)。解决方法是用方括号包裹字段名:Set RS = myConn.Execute("SELECT * FROM LL_domain WHERE [domain] = 'de'")SQL字符串解析差异
虽然当前查询的字符串'de'看似无问题,但ADODB驱动对直接拼接的SQL可能存在解析偏差。建议用参数化查询替代字符串拼接,既避免语法错误,也提升安全性:Function getMarketID(ByRef myConn As Object) As String Dim RS As Object, cmd As Object Set cmd = CreateObject("ADODB.Command") cmd.ActiveConnection = myConn cmd.CommandText = "SELECT * FROM LL_domain WHERE [domain] = ?" cmd.Parameters.Append cmd.CreateParameter("domainVal", 200, 1, 50, "de") ' 200对应adVarChar类型 Set RS = cmd.Execute ' ...后续逻辑处理 End Function数据类型不匹配
检查LL_domain表中domain字段的数据类型:如果该字段是数字类型,用字符串'de'匹配会触发类型错误。可在Access中确认字段是否为文本型,若为数字类型则需调整查询值的格式。连接或权限异常
虽然代码中调用了myConn.Open,但需确认连接是否成功建立,或当前用户对数据库文件是否有读写权限(比如文件被其他程序锁定)。可添加错误捕获查看具体信息:On Error Resume Next myConn.Open If Err.Number <> 0 Then MsgBox "连接错误: " & Err.Description Exit Function End If On Error GoTo 0
内容的提问来源于stack exchange,提问作者Mik
相关产品推荐
相关产品推荐

