powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / непонятное поведение .AddNew ADO-рекордсета
7 сообщений из 7, страница 1 из 1
непонятное поведение .AddNew ADO-рекордсета
    #38787261
Давно не брал я шашек в руки, а задача была тривиальная - из кода заполнить таблицу числовыми значениями, идущими подряд. В таблице первичный ключ - это самое значение.
Пытался добавлять через открытие ADO-рекордсета в цикле с известным нижним и верхним пределом. Алгоритм - если значение уже есть, пытаемся добавить следующее (по номеру ошибки делаем Resume Next) и т.д. до верхнего предела.
Столкнулся с неведомой хренью - если первое значение вызвало эту ошибку (повторяющиеся значения уник. индекса), то все последующие в цикле ТАКЖЕ НЕ ДОБАВЛЯЮТСЯ в таблицу, хотя их там и нет. Уже голову сломал, где я ошибся. См. тестовый код. Если кто будет тестить, запускать процедуру Test и смотреть вывод в Immediate.
Внесение rst.update в цикл ничего не изменило.
Ясно, что какая-то примитивная ошибка - но я ее не вижу :-(


Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
Option Compare Database
Option Explicit

Sub Test()
   On Error GoTo EXCEPT
    
    Call DropTable
    Call CreateTable(NoKey:=False)   'создаем таблицу с первичным ключом
'    Call CreateTable(NoKey:=True) 'создаем таблицу без первичного ключа
    Call PopulateTable(1)
    Call PopulateTable(2) 'по идее должна добавиться 1 запись в таблицу с ключом "4", но не добавляется
    Debug.Print CurrentProject.Connection.Execute("SELECT n FROM d", adCmdText).GetString(, , , ";")
    'смотрим, что получилось
    Call ClearTable
EXIT_HERE:
   Exit Sub

EXCEPT:

    Select Case Err.Number
        Case -2147217865 'таблица не существет
            Resume Next
        Case -2147217900  'таблица существует
            Resume Next
        Case Else
       MsgBox "Произошла ошибка " & Err.Number & vbNewLine & " (" & Err.Description & ") "
    End Select
    Resume EXIT_HERE

End Sub

Sub PopulateTable(ByVal n As Integer)
    Dim SQL As String, rst As ADODB.Recordset, i As Integer
   On Error GoTo EXCEPT

    SQL = "SELECT n FROM d WHERE 1=0"
    Set rst = New ADODB.Recordset
    With rst
        .Open SQL, CurrentProject.Connection, adOpenForwardOnly, adLockOptimistic
        For i = n To n + 2
            .AddNew "n", i 'Err.number -2147217887 возникает даже если такого ключа еще нет
            'в случае, если она уже возникала на предыдущем шаге цикла. (Но Resume next сбрасывает ошибку (обязан сбрасывать))
        Next i
        .Update
        
    End With
EXIT_HERE:
    On Error Resume Next
    rst.Close
    Set rst = Nothing
   Exit Sub

EXCEPT:

    Select Case Err.Number
        Case -2147217887 'повторяющиеся записи
           Resume Next
        Case Else
           MsgBox "Произошла ошибка " & Err.Number & vbNewLine & " (" & Err.Description & ") "
    End Select
    Resume EXIT_HERE
End Sub

Sub CreateTable(Optional NoKey As Boolean = False)
    Dim SQL As String
    If NoKey Then
        SQL = "CREATE TABLE d (n INTEGER NOT NULL)"
    Else
        SQL = "CREATE TABLE [d] ([n] INTEGER NOT NULL, CONSTRAINT d_pk PRIMARY KEY ([N]) )"
    End If
    CurrentProject.Connection.Execute SQL, , adCmdText + adExecuteNoRecords
End Sub

Sub DropTable()
    Dim SQL As String
    SQL = "DROP TABLE [d]"
    CurrentProject.Connection.Execute SQL, , adCmdText + adExecuteNoRecords
End Sub

Sub ClearTable()
    Dim SQL As String
    SQL = "DELETE * FROM d"
    CurrentProject.Connection.Execute SQL, , adCmdText + adExecuteNoRecords
End Sub

...
Рейтинг: 0 / 0
непонятное поведение .AddNew ADO-рекордсета
    #38787280
Cancel,
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
голову_сломал,

rst.Cancel нужно сделать после ошибки
...
Рейтинг: 0 / 0
непонятное поведение .AddNew ADO-рекордсета
    #38787317
Cancel, спасибо, хотел было порадоваться, но нет, волшебное слово не помогло. Ща попробую проверить коллекцию errors currentproject.connection, если что даст.
...
Рейтинг: 0 / 0
непонятное поведение .AddNew ADO-рекордсета
    #38787357
Фотография nord-woolf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: vbnet
1.
2.
Case -2147217887 'повторяющиеся записи
             rst.CancelUpdate


Не?
...
Рейтинг: 0 / 0
непонятное поведение .AddNew ADO-рекордсета
    #38787393
guest_rusimport
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
nord-woolf
Код: vbnet
1.
2.
Case -2147217887 'повторяющиеся записи
             rst.CancelUpdate


Не?

немного не так :) вот так работает
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
Sub PopulateTable(ByVal n As Integer)
    Dim SQL As String, rst As ADODB.Recordset, i As Integer
    SQL = "SELECT n FROM d WHERE 1=0"
    Set rst = New ADODB.Recordset
    With rst
        .Open SQL, CurrentProject.Connection, adOpenForwardOnly, adLockOptimistic
        For i = n To n + 2
        On Error GoTo 1
            .AddNew
            .Fields("n") = i
            GoTo 2
1:
            .CancelUpdate
2:
       Next i
        .Update
        
    End With
    rst.Close
    Set rst = Nothing
End Sub
...
Рейтинг: 0 / 0
непонятное поведение .AddNew ADO-рекордсета
    #38787525
nord-woolf
Код: vbnet
1.
2.
Case -2147217887 'повторяющиеся записи
             rst.CancelUpdate


Не?
да! все так, спасибо.
А вот .Update вообще не нужен,как выяснилось.
...
Рейтинг: 0 / 0
непонятное поведение .AddNew ADO-рекордсета
    #38787613
guest_rusimport
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
голову_сломалnord-woolf
Код: vbnet
1.
2.
Case -2147217887 'повторяющиеся записи
             rst.CancelUpdate


Не?
да! все так, спасибо.
А вот .Update вообще не нужен,как выяснилось.

Вот, блин , действительно, работает! Прошу пардона у nord_woolf-а, вчера неправильно ,видимо, проверил его совет и начал свой "огород городить" :)
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / непонятное поведение .AddNew ADO-рекордсета
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]