【问题标题】:vba adodb parameter query failsvba adodb参数查询失败
【发布时间】:2018-10-31 05:16:37
【问题描述】:

我的 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 之间进行交换和更改以实现我的目标。非常感谢您的帮助

【问题讨论】:

  • 不确定您所说的“交换和更改”是什么意思,也不知道为什么这是一个问题。我已经在同一个数据库中使用了两者,甚至是相同的程序。
  • 嗨 June7,我更喜欢使用 ADODB 而不是 DAO。我只是想让 ADODB 函数正常工作。
  • 为什么更喜欢 adodb?此外,Text 参数对应于adVarWChar,Access 支持 Unicode 字符。虽然在内部 VBA 确实将字符串存储为 BSTR,但您实际上永远不会以这种格式将它们传递给数据库引擎。
  • 嗨,埃里克。 adVarWChar 返回与上述相同的错误。我更喜欢 ADO 的原因是它在其他平台上受支持,而 DAO 不支持 - 我可以补充一点,ADO 优于 DAO 的问题在这里无关紧要。我的问题是如何让 ADO 代码正常工作?
  • ADO 需要不同的 Like 通配符。将Like "*" & [Local] & "*" 更改为Like "%" & [Local] & "%"

标签: vba ms-access dao adodb


【解决方案1】:

感谢您的意见。这是解决方案: 1. 按照HansUp的建议修改SQL语句。

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;

有趣的是,如果在 Access UI 中使用,此查询不会返回任何值

  1. 将 ADO 参数转换为 adBSTR - adVarChar 和 adVarWChar 均返回错误 3708 参数对象定义不正确。提供的信息不一致或不完整。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-05-01
    • 1970-01-01
    • 2014-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多