У меня следующая проблема с запросом параметра 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 для достижения моих целей. Ваша помощь будет принята с благодарностью