【问题标题】:Exporting table into another access file from ODBC从 ODBC 将表导出到另一个访问文件
【发布时间】:2017-08-02 02:03:43
【问题描述】:

我有一个带有 ODBC 连接的 sql server 数据库。我希望能够将 sqlserver 中的表导入到 access 数据库中。

我已经能够将一个表导入到 access 中,然后将其导出到另一个 access 文件中。

像这样:

DoCmd.TransferDatabase acImport, "ODBC Database", _
  "ODBC connectionstring" _
  , acTable, "SOURCE1", "DEST1", False, True

DoCmd.TransferDatabase acExport, "Microsoft Access", _
  "P:\Main-Copy.accdb" _
  , acTable, "DEST1", "DEST2"

是否可以一步完成而不是两步?

【问题讨论】:

    标签: ms-access vba


    【解决方案1】:

    考虑一个纯 SQL 解决方案,您可以在同一操作查询中连接到 SQL Server 数据库和远程 Access 数据库。下面的示例假设 MSSQL 和 MS Office 安装在相同的位版本(32/64 位)上,以便通过 DAO 正确连接。

    追加查询 (假设所有字段在两个表之间对齐,否则选择特定列)

    INSERT INTO [P:\Main-Copy.accdb].DEST2
    SELECT *
    FROM [ODBC;DRIVER={SQL Server};Server=INSTANCE\myServer;database=dbName;UID=XX;PWD=***].SOURCE1;
    

    Make-Table Query (假设之前的表不存在,否则需要DROP TABLE ...

    SELECT *
    INTO [P:\Main-Copy.accdb].DEST2
    FROM [ODBC;DRIVER={SQL Server};Server=INSTANCE\myServer;database=dbName;UID=XX;PWD=***].SOURCE1;
    

    【讨论】:

    • 谢谢你,这就是我想要的 100%
    【解决方案2】:

    罗伯特,

    您要复制数据吗?如果不是,是否只是将表附加到第二个数据库(在您的示例中)一个选项?在这种情况下,数据永远不会移动到 Access DB 中,而是在请求时获取(即双击数据库容器中的表)。如果表附加在第二个数据库中,那么您可以运行 Make Table 查询以将数据带到本地,这将是一个步骤。

    您还可以将数据从 SQL Server 推送到 DB,假设 SQL Server 可以访问正确的 DB 路径。

    【讨论】:

    • 是的,我需要数据
    【解决方案3】:

    我想了很多办法

    在第一个数据库中使用这个。调用外部数据库中的子程序

    Set appAccess = CreateObject("Access.Application")     
    appAccess.OpenCurrentDatabase "DATABASE PATH", False     
    appAccess.Run "ImportTableToExternalDB", "Clients"     
    Set appAccess = Nothing
    

    这个方法在外部数据库中。实际转账是哪个

    Public Sub ImportTableToExternalDB(TableName As String)
    
         DoCmd.TransferDatabase acImport, "ODBC Database", _
           "ODBC Connection String" _
           , acTable, TableName,  TableName, False, True
    
    End Sub
    

    感谢大家的帮助

    编辑:我决定采用 Parfait 的答案,因为它在各个方面都更简单、更高效。

    【讨论】:

    • 这仍然感觉像是两个步骤,并且可能更多开销通过 COM 调用 Access 对象。
    • 它肯定比我想要的更圆润,但这样可以降低 I/O,这是我的最终目标
    • 再次,您正在启动一个单独的 Access 对象,然后调用一个宏,可能会出现运行时异常并且必须从内存中释放对象。这一切都是通过你原来的单行 DoCmd.TransferDatabase 步骤完成的。
    • 我最初必须有两个 DoCmd.TransferDatabase 行,这会使网络流量翻倍,我不喜欢。这不是 id 喜欢这样做的方式,但我仍然认为这可能是最好的方式。如果您有更好的选择,我非常愿意看到您的回答
    • 你测试过性能吗? DoCmd 是 Access 对象库中的一个健壮的框架,非常擅长自动化导入/导出等简单任务。我确信它是用 Access 的底层 C++ 语言编写的,因此可以稳健地处理异常和读/写。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-04-30
    • 1970-01-01
    • 2016-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-10
    相关资源
    最近更新 更多