嘿所有我想创建一个调用我的MS SQL数据库的模块'存储过程。
问题是,它似乎不会将它作为记录集找到的内容传回给调用它的主函数。
主要表单代码:
Dim rst As ADODB.Recordset
Set rst = New ADODB.Recordset
Set rst = dbcon.dbConnection("StoredProcNameHere")
Debug.Print rst(0) '<-- has the number needed here
if (rst.RecordCount > 0) then...
我的模块代码:
Public Function dbConnection(proc As String, Optional parm As String)
Dim con As ADODB.Connection
Dim rst As ADODB.Recordset
Set con = New ADODB.Connection
Set rst = New ADODB.Recordset
con.ConnectionString = "Provider=SQLOLEDB; Data Source=.....etc etc"
con.Open
If parm <> null then
cmd.Parameters(0).Value = parm
End If
Set rst = con.Execute("EXEC " & proc)
Debug.Print rst(0) '<-- has the number needed here
Set dbConnection = rst
End Function
执行此操作时,在 dbConnection 中有一个断点,我有 Debug.Print rst(0)的值,并且在悬停时仍然有值主表单代码中的 Debug.Print rst(0)。但是,当它到达If语句时( if(rst.RecordCount&gt; 0)),它的值为-1 ???
我不想仅仅将 rst(0)作为字符串返回,因为一些商店的操作会有多个行而不是一个。
答案 0 :(得分:1)
正如doc(https://docs.microsoft.com/en-us/sql/ado/reference/ado-api/recordcount-property-ado)中所述,RecordCount属性不可靠用于此目的:
属性返回-1时 ADO无法确定记录的数量 或者如果提供者或游标类型不支持 总记录。
相反,使用BOF和EOF属性与MoveFirst / MoveNext完成此操作,如下所述:https://docs.microsoft.com/en-us/sql/ado/reference/ado-api/bof-eof-properties-ado
Set rs = CurrentDb.OpenRecordset(strSQL)
With rs
If Not .BOF And Not .EOF Then
.MoveFirst
While (Not .EOF)
Debug.Print rs.Fields("...")
.MoveNext
Wend
End If
.close
End With