vba запрос параметра adodb завершился неудачно - PullRequest
0 голосов
/ 31 октября 2018

У меня следующая проблема с запросом параметра adodb, который завершается ошибкой или возвращает пустой набор записей. Однако аналогичный запрос DAO выполняется успешно.

Это все в MS Access

Сначала SQL - Find_Post_Code - Он предназначен для принятия одного или обоих параметров:

PARAMETERS [Local] Text ( 255 ), FState Text ( 255 );
SELECT PCodes.postcode, PCodes.locality, PCodes.state, PCodes.long, PCodes.lat
FROM PCodes
WHERE (((PCodes.locality) Like "*" & [Local] & "*") AND ((PCodes.state)=[FState])) OR (((PCodes.locality) Like "*" & [Local] & "*") AND ((([PCodes].[state]) Like [FState]) Is Null))
ORDER BY PCodes.locality;

Теперь функция ADODB:

Public Function GetPostCode(varLocality As Variant, varState As Variant) As String
'//Purpose: Return Post Code for a varLocality and/or varState

  Dim cmd As New ADODB.Command
  Dim rst As New ADODB.Recordset

On Error GoTo Handle_err

  With cmd
    .CommandText = "Find_Post_Code"
    .CommandType = adCmdStoredProc
    Set .ActiveConnection = CurrentProject.Connection
    .Parameters.Append .CreateParameter("Local", adVarChar, adParamInput, , CStr(Nz(varLocality, "")))
    .Parameters.Append .CreateParameter("FState", adVarChar, adParamInput, , CStr(Nz(varState, "")))
    rst.CursorType = adOpenStatic
    Set rst = .Execute
  End With

  If Not rst.EOF Then
    GetPostCode = rst!postcode
  End If
  rst.Close

Handle_err:
  If Err Then
    MsgBox "Error " & Format(Err.Number) & " " & Err.Description, vbCritical, AppTitle
    Err.Clear
  End If

  Set rst = Nothing
  Set cmd = Nothing

End Function

Это не с сообщением об ошибке: Ошибка 3708 Объект параметра неправильно определен. Непоследовательная или неполная информация была предоставлена.

Если я приведу параметр как adBSTR, ошибки не будет, но в результирующем наборе записей нет данных

Однако, если я использую следующую функцию DAO, все хорошо

Public Function GetPostCode2(Locality As String, State As String) As String
'//Purpose: Return Post Code for a varLocality and/or varState

  Dim db As Database
  Dim qd As DAO.QueryDef
  Dim prmLocality As DAO.Parameter
  Dim prmFSTate As DAO.Parameter
  Dim rst As DAO.Recordset

On Error GoTo Handle_err

  Set db = CurrentDb
  Set qd = db.QueryDefs("Find_Post_Code")
  Set prmLocality = qd.Parameters!Local
  prmLocality.Value = Locality

  Set prmFSTate = qd.Parameters!FState
  prmFSTate.Value = State

  Set rst = qd.OpenRecordset

  If Not rst.EOF Then
    GetPostCode2 = rst!postcode
  End If

  rst.Close

Handle_err:
  If Err Then
    MsgBox "Error " & Format(Err.Number) & " " & Err.Description, vbCritical, AppTitle
    Err.Clear
  End If
  Set rst = Nothing
  Set prmLocality = Nothing
  Set prmFSTate = Nothing
  Set qd = Nothing
  Set db = Nothing

End Function

Я бы предпочел не менять местами между ADODB и DAO для достижения моих целей. Ваша помощь будет принята с благодарностью

1 Ответ

0 голосов
/ 01 ноября 2018

Спасибо за ваш вклад. Вот решение: 1. Измените оператор SQL в соответствии с предложением HansUp.

PARAMETERS [Local] Text ( 255 ), FState Text ( 255 );
SELECT PCodes.postcode, PCodes.locality, PCodes.state, PCodes.long, PCodes.lat
FROM PCodes  WHERE (((PCodes.locality) Like "%" & [Local] & "%") AND ((PCodes.state)= 
[FState])) OR (((PCodes.locality) Like "%" & [Local] & "%") AND ((([PCodes].[state]) 
Like [FState]) Is Null)) ORDER BY PCodes.locality;

Интересно, что этот запрос не возвращает никаких значений, если используется в интерфейсе доступа

  1. Приведите параметры ADO как adBSTR - и adVarChar, и adVarWChar оба вернули ошибку 3708 Объект параметра неправильно определен. Непоследовательная или неполная информация была предоставлена.
...