Как правильно обработать ошибку рекордсета?

Работа VB и СУБД (Access, MSSQL, MySQL, Oracle и пр.)
Правила форума
При создании новой темы не забывайте указывать используемую СУБД.
vblamer
Начинающий
Начинающий
 
Сообщения: 3
Зарегистрирован: 14.09.2006 (Чт) 12:41

Как правильно обработать ошибку рекордсета?

Сообщение vblamer » 14.09.2006 (Чт) 12:50

В цикле построчно обрабатываю файл и хочу заносить информацию в БД. Как правильно обработать ошибку, чтобы при сбое на одной строке, следующая добавилась нормально?

Пробую так:
Код: Выделить всё
Private Sub AddToDatabase(ByVal sGrId As String, ByVal sName As String, ByVal fNum1 As Double, ByVal fNum2 As Double)
    'Вставить значения в БД
    Static bDouble As Boolean
   
    On Error GoTo ErrorHandler
   
    If bDouble = False Then rs.AddNew   'Нельзя два раза подряд rs.Add (если была ошибка)
   
    bDouble = False
    rs.Fields(0).Value = sGrId
    rs.Fields(1).Value = sName
    rs.Fields(2).Value = fNum1
    rs.Fields(3).Value = fNum2
    rs.Update

Exit Sub
ErrorHandler:

        rs.Cancel
        bDouble = True  'Нельзя второй раз делать rs.Add
   
End Sub

но при последующем вызове процедури (после ошбки) получаю:
Error: Update or CancelUpdate without AddNew or Edit


Как вы посоветуете поступить?

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 14.09.2006 (Чт) 13:39

Я бы написал по другому.

Код: Выделить всё
Private Function AddToDatabase(...) As Boolean
On Error Resume Next
rs.AddNew
If Err.Number <> 0 Then Exit Function
rs.Fields(0).Value = ...
...
If Err.Number <> 0 Then
  rs.Cancel
  Exit Function
End If
rs.Update
If Err.Number = 0 Then
  AddToDatabase = True
End If
On Error GoTo 0
End Function
Lasciate ogni speranza, voi ch'entrate.

Nicky
Постоялец
Постоялец
 
Сообщения: 519
Зарегистрирован: 12.08.2004 (Чт) 12:14

Re: Как правильно обработать ошибку рекордсета?

Сообщение Nicky » 14.09.2006 (Чт) 13:42

vblamer писал(а):
Код: Выделить всё
    If bDouble = False Then rs.AddNew   'Нельзя два раза подряд rs.Add (если была ошибка)

Код: Выделить всё
'    If bDouble = False Then rs.AddNew   'Нельзя два раза подряд rs.Add (если была ошибка)
    rs.AddNew

EditMode
[EDIT]: tyomitch ;)
Последний раз редактировалось Nicky 14.09.2006 (Чт) 13:48, всего редактировалось 2 раз(а).

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 14.09.2006 (Чт) 13:44

Посоветуем проверять rs.EditMode перед добавлением.
Изображение

vblamer
Начинающий
Начинающий
 
Сообщения: 3
Зарегистрирован: 14.09.2006 (Чт) 12:41

Сообщение vblamer » 14.09.2006 (Чт) 15:07

Спасибо всем за советы. Но пока не поборол.
alibek, сделал по твоему совету, но после первой ошибки, например (-2147217887), функция всегда завершается досрочно:
Код: Выделить всё
Private Function AddToDatabase(ByVal sGrId As String, ByVal sName As String, ByVal fNum1 As Double, ByVal fNum2 As Double) As Boolean
    On Error Resume Next
   
    rs.AddNew 
    If Err.Number <> 0 Then Exit Function 'После первой ошибки функция всегда завершается на этой строке
   
    rs.Fields(0).Value = sGrId
    rs.Fields(1).Value = sName
    rs.Fields(2).Value = fSkidka
    rs.Fields(3).Value = fNacenka
   
    If Err.Number <> 0 Then
        rs.Cancel
        Exit Function
    End If
    rs.Update
    If Err.Number = 0 Then AddToDatabase = True
    On Error GoTo 0
End Function


tyomitch, а как использовать этот EditMode в обработке, не подскажешь кодом?

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 14.09.2006 (Чт) 15:11

Да, забыл.
Вначале нужно добавить If rs.EditMode Then rs.Cancel
Lasciate ogni speranza, voi ch'entrate.

vblamer
Начинающий
Начинающий
 
Сообщения: 3
Зарегистрирован: 14.09.2006 (Чт) 12:41

Сообщение vblamer » 14.09.2006 (Чт) 15:50

Спасибо, но наверно надо If rs.EditMode Then rs.CancelUpdate, потому что If rs.EditMode Then rs.Cancel ничего не дает.


Вернуться в Базы данных

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

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 5

    TopList  
cron