【问题标题】:how to apply an ADODB recordset from returned function to a form如何将 ADODB 记录集从返回的函数应用到表单
【发布时间】:2020-04-23 16:45:22
【问题描述】:

我刚刚创建了一个函数,以便我可以对查询进行参数化。

下面是用到的函数:

Public Function getLOTSRSTparam(strSQL As String, paramValue As Variant, _
                                Optional skip As Boolean) As ADODB.Recordset

    Dim Cn As ADODB.Connection
    Dim Cm As ADODB.Command
    Dim Pm As ADODB.parameter
    Dim RS As ADODB.Recordset
    Set db = CurrentDb

Set Cn = New ADODB.Connection
Cn.Open Right(LCon, Len(LCon) - 5)
Set Cm = New ADODB.Command
With Cm
    .ActiveConnection = Cn
    .CommandText = strSQL
    .CommandType = adCmdText

    For i = LBound(paramValue) To UBound(paramValue)
        .Parameters.Append .CreateParameter("ChemID", GetParameterType(paramValue(i)), adParamInput, Len(Nz(paramValue(i), " ")), paramValue(i))
    Next i

        Set getLOTSRSTparam = .Execute
  End With

End Function

出于多种原因和大量查询,我将使用此函数,但是返回的 ADODB 记录集在用作表单的记录集时出现错误。

strSQL = "SELECT * FROM Person WHERE person.firstname LIKE ? AND person.lastname LIKE ? Order by person.lastname asc, person.firstname asc"

        Dim arrValue As Variant
        Dim qStrLastName As String
        Dim qStrFirstName As String
        qStrLastName = strLastName & "%"
        qStrFirstName = strFirstName & "%"

        arrValue = Array(qStrFirstName, qStrLastName)

        Set lotsRS = getLOTSRSTparam(strSQL, arrValue)
        If lotsRS.EOF Then

            MsgBox "No patients found, try again", vbExclamation, "Error"
            Forms!frmMediDrop.NavigationSubform.Form.txtpatient.SetFocus
            DoCmd.Close acForm, "frmPxSearch"
            Exit Sub
        Else
           Do Until lotsRS.EOF
               Debug.Print lotsRS!firstName & " " & lotsRS!lastName
               lotsRS.MoveNext
            Loop
            Set Me.subfrmPxSearchList.Form.Recordset = lotsRS
        end if

如您所见,我确实循环并调试,是的,它作为名称返回的记录集全部弹出在即时窗口中......但是当我到达最后一行时,我得到:

您输入的对象不是有效的 Recordset 属性 (7965)

我不知道从哪里开始,因为我对 DAO 记录集更有经验,但是它们似乎无法使用 MYSQL 和 ODBC 直通进行参数化查询。

任何建议都会很棒,谢谢

【问题讨论】:

  • 也许在你的循环之后尝试MoveFirst,这样你就不会通过 EOF = true 的记录集?
  • 这不是真的。 Eof = 假。这就是为什么我有 it 部分,所以它只尝试设置 if eof=false
  • 你有一个循环直到 EOF....
  • ...EOF 可以为真,即使您有记录,如果您已将光标移到记录集的末尾
  • @TimWilliams 道歉,我会再试一次,昨晚我确实收到了关于移动光标的错误。我只在错误之后添加了直到 EOF 部分,以确保我什至可以正确返回数据

标签: vba ms-access adodb recordset


【解决方案1】:

我在这里找到了答案: Answer here

在打开和执行命令之前,您几乎需要将连接光标位置设置为 adUseClient。

新代码:

Public Function getLOTSRSTparam(strSQL As String, paramValue As Variant, Optional skip As Boolean) As ADODB.Recordset

    Dim Cn As ADODB.Connection
    Dim Cm As ADODB.Command
    Dim Pm As ADODB.parameter
    Dim RS As ADODB.Recordset
Set db = CurrentDb

Set Cn = New ADODB.Connection
    Cn.Open Right(LCon, Len(LCon) - 5)
    Cn.CursorLocation = adUseClient   <-------This was added
    Set Cm = New ADODB.Command
    With Cm
        .ActiveConnection = Cn
        .CommandText = strSQL
        .CommandType = adCmdText

    For i = LBound(paramValue) To UBound(paramValue)
        .Parameters.Append .CreateParameter("ChemID", GetParameterType(paramValue(i)), adParamInput, Len(Nz(paramValue(i), " ")), paramValue(i))
       Next i

        Set getLOTSRSTparam = .Execute
    End With

End Function

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-22
    • 2010-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-28
    • 2012-11-29
    相关资源
    最近更新 更多