我尝试在excel应用程序中发送sql语句后,收到运行时错误91。这是以下代码:
'Module Consts:
Public rst1 As New ADODB.Recordset 'defined in a constants module
'Module Conn:
Public Sub GetDynSQLQuery(ByVal strQuery$, ByVal rs As ADODB.Recordset)
Set rs = Nothing
If cn = "" Then Call ConnectToDb 'Sub set the variable "cn" with connectionstring to db and open the connection
With rs
.Source = strQuery 'Here comes the error
.ActiveConnection = cn
.CursorType = adOpenForwardOnly
.LockType = adLockReadOnly
.Open
End With
End Sub
'Form1:
strSql = "SELECT * FROM tbl1"
Call GetDynSQLQuery(strSql, rst1)
错误讯息:
未设置对象变量或With-block变量
我做错了什么我看不见。
答案 0 :(得分:2)
你在sub中做的第一件事是你清空刚刚通过的Argument(Set rs = Nothing
),然后再次使用rs
。
所以除非rs
是类似公众的变量并且已填入ConnectToDb
,
在使用之前仍然是空的,错误的错误!
首先,尝试删除Set rs = Nothing
,如果还不够,则需要查看ConnectToDb
!
其次,你修改了sub中的Recordset,但你试着在外面使用它。
这里的问题是使用ByVal
,它传递了Object的引用副本,所以你不能修改初始对象,因为RecordSet在Sub之外是空的! ;)
由于OP测试的rst1.RecordCount > 0
是假的(rst1.RecordCount
等于-1),所以
他通过将.CursorType
设置为adOpenKeySet
而非adOpenForwardOnly
Public Sub GetDynSQLQuery(ByVal strQuery$, rs As ADODB.Recordset)
'Sub set the variable "cn" with connectionstring to db and open the connection
If cn = vbNullString Then Call ConnectToDb
With rs
.Source = strQuery 'No more error!^^
.ActiveConnection = cn
.CursorType = adOpenKeySet
.LockType = adLockReadOnly
.Open
End With
End Sub