Закрытие рекордсета, к которому подключён DataGrid.

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
HiMik2003
Новичок
Новичок
 
Сообщения: 33
Зарегистрирован: 21.07.2003 (Пн) 11:32
Откуда: Кишинёв

Закрытие рекордсета, к которому подключён DataGrid.

Сообщение HiMik2003 » 10.02.2006 (Пт) 20:05

Надо ли самому закрывать подобный рекордсет при закрытии формы (которая открыта из другой формы)?

Вопрос не так очевиден. Если DataGrid в этот момент находится в режиме редактирования записи, при попытке закрыть рекордсет могут возникать ошибки, что неприятно.

На мой вгляд есть три способа решения проблемы:
1. Не закрывать рекордсет вообще при закрытии формы (но закрыть его перед повторным заполнением)
2. Закрывать рекордсет по событию Form Terminate (Которое надо ещё заставить произойти, см. пример)
3. Заставить DataGrid отключиться от рекордсета принудительно (я использовал отправку сообщения WM_CLOSE)

Посмотрите присоединённый пример и давайте его обсудим.
(В примере подключение - к SQL Server, но можно переделать и под Access(как - в примере указано); разницы я не заметил)
Вложения
DtgAndRst.rar
(4.3 Кб) Скачиваний: 23

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 11.02.2006 (Сб) 4:50

Код: Выделить всё
Public Sub SafeCloseRecordset(ByVal r As ADODB.Recordset, Optional ByVal Save As Boolean = False)
  On Error Resume Next
  If Not r Is Nothing Then
    If r.State = adStateOpen Then
      If r.EditMode <> adEditNone Then
        If Save Then r.Update Else r.CancelUpdate
      End If
      r.Close
    End If
  End If
  On Error GoTo 0
End Sub
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

HiMik2003
Новичок
Новичок
 
Сообщения: 33
Зарегистрирован: 21.07.2003 (Пн) 11:32
Откуда: Кишинёв

To GSerg

Сообщение HiMik2003 » 11.02.2006 (Сб) 11:25

Я поправил немного:
Код: Выделить всё

Sub SafeCloseRecordset(ByVal r As ADODB.Recordset, Optional ByVal Save As Boolean = False)
  If Not r Is Nothing Then
    If r.State = adStateOpen Then
      If r.BOF = False And r.EOF = False Then ' если нет текущей записи - нельзя обращатся к EditMode - это вызовет ошибку!
        If r.EditMode <> adEditNone Then
          If Save Then r.Update Else r.CancelUpdate
        End If
      End If
      r.Close
    End If
  End If
End Sub


Твой вариант был плох если удалить все записи. On Error Resume Next - игнорировать - не всегда хорошо :)
Что касается CancelUpdate - не забудем, что отменяется только изменение в текущей (одной) записи, а не все те изменения, которые делал юзер в датагриде! Не уверен, что это здесь вообще надо.

Кажись всё работает как надо, большое спасибо!!!

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 11.02.2006 (Сб) 11:31

Нужно закрыть режим редактирования до закрытия рекордсета. Поэтому режим редактирования закрывается. А on error resume next стоял исключительно потому, что всё это вызывается на выходе из формы, и закрывать всё равно надо...
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: Google-бот и гости: 73

    TopList