在Access中执行相同查询时,使用ADODB记录集不返回值

问题描述 投票:0回答:1

我在使用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

sql excel vba ms-access adodb
1个回答
0
投票

尝试使用通配符%而不是星号*

© www.soinside.com 2019 - 2024. All rights reserved.