как применить набор записей ADODB из возвращенной функции к форме - PullRequest
1 голос
/ 23 апреля 2020

У меня есть функция, которую я только что сделал, чтобы я мог параметризовать свои запросы.

Ниже приводится используемая функция:

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 получает ошибку, когда используется как reocrdset формы.

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

Как вы можете видеть, я выполняю l oop и отлаживаю, и да, набор записей возвращается, так как все имена всплывают в ближайшем окне ... однако, когда я добираюсь до последней строки, я получаю:

Введенный вами объект не является допустимым свойством Recordset (7965)

Я не знаю, куда отсюда go, так как у меня больше опыта работы с наборами записей DAO, однако они не могут иметь параметризованные запросы с использованием MYSQL и ODB C passthrough.

Любой совет был бы великолепен, спасибо

1 Ответ

1 голос
/ 24 апреля 2020

Я нашел ответ здесь: Ответ здесь

В значительной степени (и я не понимаю никакой теории этого), вам нужно установить местоположение курсора соединения на 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
...