【问题标题】:Alternative to Index + Seek on Access/DAO Using SQL Server/ADO使用 SQL Server/ADO 替代 Index + Seek on Access/DAO
【发布时间】: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


【解决方案1】:

解决方案是编写 SQL 查询 create procedure dbo.prc_TableNameUpdIns (@parm1 int, @parm2 int) AS IF EXISTS (SELECT * from MyTable WHERE A = @parm1 AND B = @parm2) UPDATE ... ELSE INSERT....

(您可以使用合并,但我不建议这样做)

然后您通过创建 AdoConnection 来调用 SP(在 VBA 中) dim myAdoConnection as ADOConnection

将 X 设为整数,将 Y 设为整数 X = 7 Y = 8

'设置 myAdoConnection '调用过程 myAdoConnection.prc_TableNameUpdIns X, Y

最好在 SQL 中处理尽可能多的代码。您唯一需要进行这种类型的 ADO 操作的时候是您需要更新表单only 而不一定是数据库本身。

关于ADO connection 再研究一下这个主题,这只是一个指针

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-03-02
    • 1970-01-01
    • 2015-06-26
    • 2015-05-09
    • 2012-10-31
    • 1970-01-01
    • 2010-09-10
    • 1970-01-01
    相关资源
    最近更新 更多