vba - 如何在从头创建的 ADODB.Recordset 上强制执行主键唯一性?
问题描述
我正在使用记录集作为我正在获取的某些数据的载体。我得到了重复,我很好奇如果尝试添加重复,如何让记录集抱怨。
所以,本质上我想创建一个关键字段。我找到了 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 专家。
更新:我在 RecordSet 对象上找到了一个 Supports 方法,如果我传入,CursorOptionEnum.adIndex
那么它会回复 False。也许使用不同的提供商?
解决方案
正如@AlexK 所指出的,这无法实现
ADODB 记录集不支持自身的约束。执行约束的是数据库,而不是记录集。如果您的记录集没有更新到数据库,则没有约束。
为了演示此行为,您可以在 Access 中测试以下内容:
创建一个名为 Table1 的表,其中包含 2 个字段(ID、主键、Field1、字符串)
运行以下代码:
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
事件上设置处理程序以强制执行约束,但您说您对此不感兴趣。
can't be done允许每个答案“这不可能”是一个可接受的答案吗?
推荐阅读
- vb.net - 文件被远程PC删除并重新保存后vb.net找不到文件
- intershop - 从 CatalogCategoryBO 获取 ProjectBO 根据 BusinessObjectRepositoryContext 返回不同的结果
- objective-c - 使用网桥从 .framework 导入文件时出错
- c# - 如何操作复选框中选定值的列表 - C#
- azure - 更改为运行时后 Azure Functions 损坏?
- java - 在 session.close() 之后设置 session=null 有意义吗?
- sequelize.js - 您可以使用 Sequelize.js 隐藏(非自动生成的)连接表的输出吗?
- sql - 如何使用 string_agg 对转换后的字段进行排序
- javascript - 无法解析有效的 JSON
- eclipse - ClassNotFoundException:com.itextpdf.text.Element