#ms-access #vba
#ms-access #vba
Вопрос:
Я пытаюсь открыть 2 набора записей ADODB при событии нажатия кнопки, например:
Private Sub btn1_Click()
Dim rs As New ADODB.Recordset
Dim rst As New ADODB.Recordset
rs.Open "UPDATE table ITEM = " amp; Me.ITEM amp; " where ID = " amp; ID, CurrentProject.Connection
rs.Close
Set rs = Nothing
rst.Open "Update Table2 set Item2 = " amp; Me.Item2,CurrentProject.Connection
End Sub
Первая ошибка, которую я получаю, находится на rs.close
, где говорится:
Операция не разрешена, когда объект закрыт.
Я действительно смущен этой ошибкой, поскольку я явно не закрыл набор записей rs
.
Но даже когда я удаляю rs.close
, я получаю:
Введенное вами выражение относится к объекту, который закрыт или не существует
на
rst.Open "Update Table2 set Item2 = " amp; Me.Item2,CurrentProject.Connection
Ответ №1:
Первая ошибка (вкл rs.Close
) произошла из-за того, что набор записей никогда не открывался.
Ваше UPDATE
(когда вы включили SET
ключевое слово) выполнено успешно, но UPDATE
не возвращает записи. Таким образом, набор записей не был открыт. Запустите следующий код, чтобы прояснить ситуацию…
Dim rs As New ADODB.Recordset
Dim strUpdate As String
strUpdate = "UPDATE table SET ITEM = " amp; Me.item amp; " where ID = " amp; id
rs.Open strUpdate, CurrentProject.Connection
If rs.State = adStateClosed Then
Debug.Print "can't close recordset because it's already closed"
Else
rs.Close
End If
Когда вы хотите выполнить UPDATE
, вам не нужен набор записей; вам даже не нужен ADO. Вы можете просто сделать это…
CurrentDb.Execute strUpdate, dbFailOnError
Что касается вашей второй ошибки, я не уверен в причине, но подозреваю, что проблема заключается в построении текста инструкции. Предлагаю вам добавить это в свой код и запустить его…
Debug.Print "Update Table2 set Item2 = " amp; Me.Item2
Если это не вызывает ту же ошибку, скопируйте текст инструкции из немедленного окна и вставьте его для тестирования в представление SQL нового запроса в конструкторе запросов Access. Если вы не знакомы с непосредственным окном, Ctrl g приведет вас туда.
Комментарии:
1. Вы правы в отношении обеих ошибок. Вторая ошибка на самом деле возникла из-за того, что я закрыл форму перед выполнением этой строки. Это сделало
me.Item2
недопустимым. Извините, я забыл добавить код закрытия формы выше.
Ответ №2:
.Open
Метод предназначен не для запроса действия, а для запроса выбора.
Комментарии:
1. Я уверен, что это неверно, потому что мой первый
rs.open
код обновляет таблицу
Ответ №3:
Поскольку вы оцениваете update
инструкции, вам следует использовать .Execute
метод объекта ADODB Connection, а не .Open
метод.