Удаление строк из таблицы с помощью цикла - PullRequest
1 голос
/ 11 ноября 2009

Почему мой цикл Do Until пытается запустить raw.Delete, хотя raw.EOF имеет значение true? Если у меня есть пустая таблица, это вылетает. Почему?

Dim raw As Recordset
Set raw = db.OpenRecordset("tblSampleRaw")

If raw.RecordCount > 0 Then
    raw.MoveFirst

    Do Until raw.EOF
        raw.MoveFirst
        raw.Delete
    Loop
End If

Ответы [ 4 ]

3 голосов
/ 11 ноября 2009

Вы выполняете операцию Row-By-Agonizing-Row или RBAR (reebar). Чем больше стол, тем больше времени это займет.

Большинство баз данных могут работать более эффективно, чем RBAR. Я предлагаю вам думать с точки зрения наборов, а не строк.

Я думаю, вы должны заменить весь этот блок кода следующим:

DoCmd.RunSQL "DELETE * FROM tblSampleRaw"

для целей ответа

Dim raw As Recordset
Set raw = db.OpenRecordset("tblSampleRaw")

If raw.RecordCount > 0 Then
    raw.MoveFirst

    WHILE NOT raw.EOF or raw.BOF
        raw.MoveFirst
        raw.Delete
    Loop
End If
2 голосов
/ 11 ноября 2009

Я не уверен, или эксперт VBA, но почему вы постоянно делаете MoveFirst? Вы никогда не продвигаетесь вперед в записи. Попробуйте

Do Until raw.EOF
        raw.Delete
        raw.MoveNext
 Loop
0 голосов
/ 11 ноября 2009

Как насчет Dim raw AS DAO.Recordset?

0 голосов
/ 11 ноября 2009

Я не программист на VB, но похоже, что «raw» будет продолжать сбрасывать цикл даже после того, как он выполнит MoveFirst.

...