Использование набора записей ADODB не возвращает значение, когда тот же запрос в Access делает - PullRequest
0 голосов
/ 12 января 2020

У меня неприятная проблема с EXCEL VBA, использующим набор записей ADODB. У меня есть запрос, который напрямую в Access работает правильно, но когда я помещаю его в VBA, набор записей всегда возвращается ноль. У меня есть другие запросы, которые работают, как и ожидалось, но что-то в этом типе запросов всегда не может вернуть результат в VBA, даже если он работает в Access.

Ниже приведена функция, отвечающая за выполнение запроса. Он построен для того, чтобы я мог делать подсчеты, и в аналогичной функции суммы в таблице ProjList. Первый запрос стиля используется там, где не должен использоваться флаг ограничения года (sYrIn = -1), и он работает как ожидалось.

Второй запрос стиля - это когда год в флаге содержит значение для ограничения количества или сумма к указанному c году. Наши идентификаторы проекта имеют форму X99-999, где первая позиция обозначает тип проекта, следующие две цифры обозначают год, в котором был открыт проект, а последние три цифры представляют собой уникальное увеличенное число, которое сбрасывается в 001 каждый год.

Здесь есть ряд строк, которые предназначены только для отладки обратной связи. Ниже кода я включил некоторые результаты отладки.

Я понимаю, что мы должны задать конкретный c вопрос, но у меня есть четыре, которые тесно связаны с этой ситуацией и примером кода, и не думаю, что так тесно связаны четыре поста - это хорошо. Мои вопросы о втором наборе запросов. Они никогда не работают в 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

1 Ответ

0 голосов
/ 13 января 2020

Попробуйте использовать подстановочный знак%, а не звездочку *

...