2017-02-13 15 views
1

Я получаю ошибку выполнения 91 после попытки отправить инструкцию sql в моем приложении excel. Вот следующий код:Ошибка выполнения 91 в VBA превосходит ADODB.Recordset

'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) 

Сообщение об ошибке:

переменная объекта или С-блока переменной не установлено

Что я делаю неправильно, я не могу видеть это.

+1

'Set rs = Nothing'', а затем используйте 'rs'. Поэтому, если 'rs' является общедоступной переменной и заполняется' ConnectToDb', она остается пустой перед использованием, ergo ошибка! – R3uK

+0

@ R3uK rs установлен в «Nothing» или что вы имеете в виду именно? – yuro

+0

Мой плохой для предыдущего форматирования, см. Ответ для более простого объяснения! – R3uK

ответ

2

Первое, что вы делаете в подразделе, - это то, что вы опустошили Аргумент (с Set rs = Nothing), который вы только что прошли, а затем снова используете rs.

Так за исключением случаев rs является Государственно-как переменная и она заполнена ConnectToDb,
он остается пустым, прежде чем использовать, Ergo ошибку!

Сначала попробуйте удалить Set rs = Nothing, и если этого недостаточно, вам нужно будет изучить ConnectToDb!

Во-вторых, вы изменяете набор записей внутри суб, но вы пытаетесь использовать его снаружи.
И проблема здесь заключалась в использовании ByVal, которые передают копию ссылки объекта и поэтому вы НЕ можете изменить исходный объект, ergo тот факт, что RecordSet пуст за пределами Sub! ;)


И как ОП испытания 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 
+0

Извините, но для меня это не работает. Я не получаю никаких данных ответа. – yuro

+0

@yuro: Как использовать 'GetDynSQLQuery'? – R3uK

+0

Я использую 'GetDynSQLQuery' только для отправки инструкции sql, как вы можете видеть выше. – yuro

Смежные вопросы