【发布时间】:2019-09-08 09:59:05
【问题描述】:
我正在将 Excel 应用程序从本地 MS Access 后端(使用 DAO)转换为在 Azure 上运行的 SQL Server(使用 ADO)。
我使用 DAO 执行的一个常见任务是使用 index + seek 方法扫描大量输入行(约 10,000 行,并使用多字段索引),检查数据库中的匹配记录,并更新或添加新记录必需的。在决定添加或更新时,Seek 方法的 NoMatch 属性非常有效。
这对于 SQL Server 来说似乎应该很简单,但我似乎找不到一个好的解决方案来让我检查匹配、添加或更新以及使用多列索引。
将表下载到内存然后进行批量更新就可以了,但是ADO的Find方法似乎不如index + seek,并且它不能使用多列。使用支持索引搜索的 ADO 提供程序连接到 SQL Server 也可以(Jet 4.0?),但我也找不到这样的示例。
我是否遗漏了一些明显的东西?检查和添加或更新大量行到 SQL Server 的最佳方法是什么?谢谢
编辑: 下面是我目前在 Access/DAO 中进行的操作的一个简单示例:
Set rs = db.OpenRecordset("TableName", dbOpenTable)
With rs
.Index = "MultiFieldIndex"
'Loop through the input data
For i = 1 To 10000
.Seek "=", Criteria1, Criteria2
If Not .NoMatch Then
'Found a match, just update specific fields
!Field1 = a
!Field2 = b
Else
'No match found, add a new record then populate
.AddNew
!Field3 = c
!Field4 = d
End If
.Update
Next i
End With
仅使用 SQL 执行此类操作的最佳方法是什么?我仍然可能会从加载完整目标表的断开连接的记录集开始,但是当我不知道是否需要更新或添加新记录或输入的值时,我不确定如何更新几千条记录标准。如何在没有索引 + 查找的情况下找到我需要更新/检查的行?
或者我可以在内存中创建一个只有输入数据的临时表,然后以某种方式将该表“合并”到数据库中,然后数据库会弄清楚如何更新或添加?
我觉得这应该是一个非常基本的过程,但也许我只是缺少一些基本的 SQL 概念?
感谢大家的帮助!
【问题讨论】:
-
嗨 Jayme,欢迎来到 StackOverflow!您能否在 DAO 中添加您的代码示例?无需对 DAO 代码过于明确,即使是一个简单的示例,例如“select * from table; update table set column = 7 where key= 2”,也足以帮助我们帮助您如何将代码从 DAO 转换为ADO。谢谢!
-
“在 SQL Server 中检查和添加或更新大量行的最佳方法是什么?”
UPDATE后跟INSERT在单个操作中交易将是我的首选方法。 -
10K 根本不是数据,可能适合 CPU 的缓存。即使在 Access 中检索内存中的所有数据也很慢,并且如果两个或多个用户正在访问同一个表,或者如果一个用户想要更新/插入多行,则将无法正常工作。即使在 Access 中,更快的方法是使用 SQL 来修改数据,而不是像 Find 这样的操作。索引也是预先定义的。您可以定义具有多个列的多个索引。当数据被修改时,数据库会自动更新它们。
-
BTW DAO 在 1998 年的某个地方被抛弃了,我想——我抓住了那个转变。自 2000 年以来,甚至 Access 都可以与 ADO 一起使用。单次 UPDATE WHERE 远比在游标内查找、修改、存储和重复项目要快得多。在多用户环境中,结果将是不断的阻塞和并发冲突。您找不到任何文档的原因是因为这种工作方式在 20 年前就被放弃了。任何相关文档都来自那个时期,并且可能没有幸存下来 - 那时,这些文档包含在 4 张 CD 中,包含整个 MSDN 库,后来变成了 1 张 DVD。
-
使用 ADO 的典型方法是加载 disconnected recordset(这意味着您实际上关闭了连接),对其进行任何修改,然后连接回数据库并应用任何更改。乐观并发用于捕获冲突,而不是事务。这比事务和游标的可扩展性和速度要快几个数量级——想想要快数千倍。
标签: sql-server excel vba ado dao