我正在使用记录集作为获取某些数据的工具。我正在获取重复项,并且对如何尝试添加重复项使记录集抱怨感到好奇。
因此,从本质上讲,我想创建一个关键字段。我找到了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。也许使用其他提供商?
答案 0 :(得分:2)
这无法实现,如@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
事件上设置处理程序以强制执行约束,但是您表示对此并不感兴趣。
无法完成允许回答