Введенное вами выражение относится к объекту, который закрыт или не существует ошибка

#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 метод.