【发布时间】: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