Как обеспечить уникальность первичного ключа для ADODB.Recordset, созданного с нуля? - PullRequest
0 голосов
/ 18 сентября 2018

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

Итак, по сути, я хочу создать ключевое поле.Я нашел параметр adFldKeyColumn, но он не применяется, я должен что-то упустить.

Function CreateIndexedRecordSet() As ADODB.Recordset
    Dim rs As ADODB.Recordset
    Set rs = New ADODB.Recordset
    rs.Fields.Append "Name", adBSTR, 255
    rs.Fields.Append "pkey", adInteger, , adFldKeyColumn
    rs.Open

    rs.AddNew Array("Name", "pkey"), Array("foo", 1)
    rs.AddNew Array("Name", "pkey"), Array("bar", 1)  '<--- this should complain

    Debug.Print rs.Supports(CursorOptionEnum.adIndex) '<--- sadly prints False, perhaps use a different provider?

    Set CreateIndexedRecordSet = rs
End Function

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

ОБНОВЛЕНИЕ: Я нашел метод Supports для объекта RecordSet, если я передаю CursorOptionEnum.adIndex, то он отвечает False.Возможно, используете другого поставщика?

1 Ответ

0 голосов
/ 18 сентября 2018

Этого нельзя достичь, как отмечает @ AlexK

Наборы записей ADODB не поддерживают сами по себе ограничения.Это база данных, которая устанавливает ограничения, а не набор записей.Если ваш набор записей не обновляется в базе данных, ограничений нет.

Чтобы продемонстрировать это поведение, вы можете проверить следующее в Access:

Создать таблицу с именем Table1 с 2 полями (ID, первичный ключ, поле1, строка)

Запустите следующий код:

Dim rs As New ADODB.Recordset
Dim conn As ADODB.Connection
Set conn = CurrentProject.Connection
conn.CursorLocation = adUseClient
rs.Open "SELECT * FROM Table1", conn, adOpenKeyset, adLockBatchOptimistic 'Open up recordset
Set rs.ActiveConnection = Nothing 'Disconnect it from the database connection
rs.AddNew Array("ID", "Field1"), Array(1, "A") 'Add a record
rs.AddNew Array("ID", "Field1"), Array(1, "A") 'And another identical one
Set rs.ActiveConnection = conn
'All fine until here, recordset contains 2 records with identical primary key
rs.UpdateBatch 'Errors, duplicate primary key

Конечно, вы можете вручную проверить наличие дубликатов или установить обработчик для события Recordset_WillChangeRecord вприменять ограничения, но вы сказали, что вас это не интересует.

не может быть сделано ответы разрешены для Является ли «это невозможно» приемлемымответить

...