Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > VB6 > Обращение к базе данных. Результат с ошибкой.


Автор: korob2001 2.11.2004, 02:27
Привет!
Это опять я. ;)
У меня возникла такая проблема:

1. Создаю таблицу address в файле db1.mdb, такой структуры:
id | name | family
---|---------|------------
1 | Vasya | Pupkin

Где id уникальный номер, который добавляется автоматически при добавлении новой записи в таблицу.

2. Создаю рядом файл db1.udl и связываю его с файлом db1.mdb который создал в первом пункте.

3. Затем в проект добавляю компоненты:
a.) Microsoft ADO Data Control 6.0
b.) Microsoft DataGrid Control 6.0

4. Добавляю на форму:
ADO Data Control - ( adoBase ),
DataGrid Control ( grdTable )
и две кнопки
Delete - (cmdDel),
Exit - ( cmdExit ).

5. Компоненту adoBase назначаю следующие параметры:
ConnectionString = путь к файлу .udl
RecordSource = "SELECT * FROM address"

6. Компоненту grdTable назначаю следующие параметры:
AllowUpdate = False
DataSource = adoBase

7. Для всей этой бадяги пишу такой код:
Код

Option Explicit
Private checkSelected


Private Sub cmdDel_Click()
       Dim queryString$
       If IsNumeric( checkSelected ) And checkSelected > 0 Then
          queryString = "DELETE FROM address WHERE id=" & checkSelected
          adoBase.RecordSource = queryString
          adoBase.Refresh
       Else
          MsgBox "You must selected id for delete row", vbOKOnly, "Error"
       End If
End Sub

Private Sub cmdExit_Click()
       Unload Me
       End
End Sub

Private Sub grdTable_RowColChange(LastRow As Variant, ByVal LastCol As Integer)
       checkSelected = grdTable.Text
End Sub


Проблема, собственно, в процедуре обработки события cmdDel_Click. В общем, пользователь должен сначала выделить id той строки, которую необходимо удалить. Всё вроде работает, строка, действительно, удаляется, но после каждой удалённой строки я получаю такое сообщение об ошибке:

Операция не допускается, если объект закрыт

После чего VB указывает на эту строку кода: adoBase.Refresh

Подскажите, пожалуйста, как это лечится?!!! Я уже несколько раз перечитал раздел в книге по данной теме, но ничего так и не понял. Несколько раз пробовал создавать аналогичное подключение. Результат тот же.

Извините за такое длинное сообщение, просто хотелось изложить подробно, дабы не напрягать вас в таких мелочах, как какие компоненты я использовал и какие у них имена и т.п.

Заранее спасибо,
Денис

Автор: -Mikle- 2.11.2004, 16:58
Я не работаю с контролами типа ADODC, но предполагаю что проблема в том, что инструкция DELETE не возращает записи. Любопытно то, что у контрола нет метода Execute, который как раз таки и используется для выполнения SQL-инструкций, не возвращающих ни одной записи. Попробуй сделать так, как я предлагаю, может получится.
Код

Option Explicit
Private checkSelected


Private Sub cmdDel_Click()
  Dim queryString$
  If IsNumeric( checkSelected ) And checkSelected > 0 Then
    adoBase.RecordSource = "DELETE FROM address WHERE id=" & checkSelected
    adoBase.RecordSource = "SELECT * FROM address"
    adoBase.Refresh
  Else
    MsgBox "You must selected id for delete row", vbOKOnly, "Error"
  End If
End Sub

Private Sub cmdExit_Click()
  Unload Me
End Sub

Private Sub grdTable_RowColChange(LastRow As Variant, ByVal LastCol As Integer)
  checkSelected = grdTable.Text
End Sub


может быть это "криво", но только потому, что я никогда не использую контролы дла работы с базами. Лучше всего использовать ADO подключенную через References, дабы не было вот таких вот "тупиков".

Автор: boevik 2.11.2004, 17:00
-Mikle-, выполнится только select.

Автор: -Mikle- 2.11.2004, 17:07
Цитата(boevik @ 2.11.2004, 21:00)

-Mikle-, выполнится только select.

блин, то есть при рефреше происходит выполнение запроса... логично конечно... но как человеку помочь? Может On Error Resume Next поставить? :D

Автор: REVOLT 2.11.2004, 21:01
-Mikle-, это точно!

З.Ы свяжись со мной 256-824-960

Автор: cardinal 2.11.2004, 21:42
korob2001, тебе сюда:
http://juicystudio.com/tutorial/vb/database.asp
:)

Автор: -Mikle- 3.11.2004, 16:16
cardinal, он же не с объектами ADO работает, а с ADODC (контрол)
хотя ссылка очень полезная, лучше ему писать проги используя ADO

Автор: korob2001 3.11.2004, 21:14
Спасибо. Я бегло просмотрел, похоже на то, что нужно. Сейчас внимательно почитаю. Если возникнут вопросы, буду писать их здесь.
Ещё раз спасибо.

Автор: korob2001 10.11.2004, 23:41
Решил проблему таким способом:
Код

Option Explicit
Private checkSelected As Variant

Private Sub cmdClose_Click()
       Unload Me
       End
End Sub

Private Sub cmdDelete_Click()
       Dim queryString$
       Dim cn As ADODB.Connection
       Set cn = New ADODB.Connection
       cn.Open "DSN=aaa"

       
       If IsNumeric(checkSelected) And checkSelected > 0 Then
          queryString = "DELETE FROM myFirst WHERE id=" & checkSelected
          cn.Execute queryString
          cn.Close
          adoBase.Refresh
       Else
          MsgBox "You must selected id for delete row", vbOKOnly, "Error"
       End If
   
       Set cn = Nothing
End Sub

Private Sub Form_Load()
       Call tmrTime_Timer
End Sub

Private Sub grdData_RowColChange(LastRow As Variant, ByVal LastCol As
Integer)
       checkSelected = grdData.Text
       adoBase.Caption = grdData.Text
End Sub

Теперь всё работает.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)