我在使用ADODB记录集的EXCEL VBA中遇到令人沮丧的问题。我有一个直接在Access中可以正常工作的查询,但是当我将其放在VBA中时,记录集始终返回null。我还有其他按预期方式运行的查询,但是关于这种类型查询的某些信息始终无法在VBA中返回结果,即使它在Access中也可以。
下面是负责执行查询的函数。它的构建使我可以进行计数,并且在类似的功能中,可以对ProjList表进行求和。第一个样式查询用于不使用年份限制标志(sYrIn = -1)的地方,并且按预期方式工作。
第二种样式查询是当年份标记中包含一个将计数或总和限制为特定年份的值。我们的项目ID的格式为X99-999,其中第一个位置表示项目的类型,后两位数字表示项目开始的年份,后三位数字是唯一的递增数字,每年重置为001。
这里有许多行仅用于调试反馈。在代码下面,我包含了一些调试输出。
我知道我们要提出一个具体的问题,但是我有四个与这种情况和代码示例紧密相关,并且认为四个紧密相关的帖子不是一件好事。我的问题是关于第二组查询。他们从不在VBA中工作。1)在这种情况下,我是否错误地读取了记录集?2)以这种方式执行的查询的“复杂性”是否有某些限制?3)为什么第一个查询返回运行,而第二个查询不返回?4)是否有更好的方法查看实际查询执行结果?
再次在Access中运行所有查询。注意:由于实际代码使用当前年份,所以出现的代码已对年份进行了硬编码,并且2020年的数据不足以使结果有意义(0为0!)第二种类型也有两个查询。其中一个已被注释掉-它在VBA中遭受同样的失败,而在Access中则遭受成功。
Function GetDBProjCount(sCharIn As String, sFldIn As String, Optional sYrIn As Integer = -1) As Integer
Dim iResult As Integer
Dim sQryString As String
Dim sSearchChar As String
Dim pQryParam As Object
Dim sParamValA As String
Dim sParamValB As String
Dim iParamLenA As Integer
Dim iParamLenB As Integer
iResult = 0
Call MakeDBConnection
Set pQryParam = CreateObject("ADODB.Parameter")
If CInt(sYrIn) > 0 Then
If ((CInt(sYrIn) > 10) And (CInt(sYrIn) < 50)) Then
sYrIn = Right(sYrIn, 2)
ElseIf ((CInt(sYrIn) > 2010) And (CInt(sYrIn) < 2050)) Then
sYrIn = Right(sYrIn, 2)
Else
sYrIn = -1
End If
End If
If sYrIn < 0 Then
sQryString = "SELECT Count(*) FROM " & tblProjList & " WHERE Left(" & sFldIn & ", 1)=?;"
sParamValA = sCharIn
sParamValB = ""
iParamLenA = 1
iParamLenB = 1
Else
sQryString = "SELECT Count(*) FROM (Select * from [" & tblProjList & "] WHERE [" & garProjListFlds(4, 1) & "] Like ?) WHERE Left([" & sFldIn & "],1)=?;"
'sQryString = "SELECT Count(*) FROM [" & tblProjList & "] WHERE ((Left([" & sFldIn & "], 1)= ? ) AND ([" & garProjListFlds(4, 1) & "] LIKE ?));"
sParamValA = "*19-*" 'comment "'*" & CStr(sYrIn) & "-*'"
sParamValB = sCharIn
iParamLenA = 8
iParamLenB = 1
End If
If QDebugMode Then Debug.Print "GetDBProjCountA: " & sQryString
With goDBCmd
.ActiveConnection = goDBConn
.CommandText = sQryString
.CommandType = adCmdText
Set pQryParam = .CreateParameter("ParamA", adChar, , iParamLenA, sParamValA)
.Parameters.append pQryParam
If sYrIn > 0 Then
Set pQryParam = .CreateParameter("ParamB", adChar, , iParamLenB, sParamValB)
.Parameters.append pQryParam
End If
Set goDBRecSet = .Execute
End With
If QDebugMode Then Debug.Print ("GetDBProjCountB: Parameters: A: " & sParamValA & " B: " & sParamValB)
Dim msg, fld
For Each fld In goDBRecSet.Fields
msg = msg & fld.Value & "|"
Next
If QDebugMode Then Debug.Print ("GetDBProjCountC: Result: " & msg)
GetDBProjCount = goDBRecSet.Fields(0)
Call CloseDBConnection
End Function
这是我在即时窗口中看到的内容:
GetDBProjCountA: SELECT Count(*) FROM ProjList WHERE Left(ProjArchiveFlag, 1)=?;
GetDBProjCountB: Parameters: A: O B:
GetDBProjCountC: Result: 45|
GetDBProjCountA: SELECT Count(*) FROM (Select * from [ProjList] WHERE [ProjCCID] Like ?) WHERE Left([ProjArchiveFlag],1)=?;
GetDBProjCountB: Parameters: A: *19-* B: O
GetDBProjCountC: Result: 0| (In Access this one returns 44)
该记录集在MakeDBConection子对象中实例化为
Set goDBRecSet = New ADODB.Recordset
goDBRecSet.ActiveConnection = goDBConn
goDBRecSet.CursorLocation = adUseClient
goDBRecSet.CursorType = adOpenStatic
goDBRecSet.LockType = adLockPessimistic
Set goDBCmd = New ADODB.Command
连接字符串为:“ Provider = Microsoft.ACE.OLEDB.12.0;” &“数据源=”&DBPath
尝试使用通配符%而不是星号*