将远程数据库中的部分表导入本地Microsoft Access访问数据库

时间:2017-08-08 14:16:48

标签: sql database vba ms-access informix

问题:

我尝试将远程informix数据库的部分导入到访问2016数据库中。要部分导入的表包含帐户信息,并且> 2 GB(根据我的理解,它是访问数据库的最大大小)。

我只需要去年的信息远远低于2 GB但信息必须在每天结束时更新。

我在网上看到的两个解决方案是:

(A)链接表格:

我不愿意这样做有两个原因:

1)每次访问数据库的最终用户运行报告时,我都不希望在服务器上放置额外的负载。

2)我不希望在访问数据库中进行任何更改以转移到live informix数据库(这绝对是个小问题)

(B)通过访问GUI

复制整个表格

由于以下原因,我认为这是一个可行的解决方案:

1)表格超过2GB

2)必须每天在桌面上运行报告,并提供每日更新信息。这需要每天将整个informix表拉入访问状态。

到目前为止工作:

通过为informix db创建dsn,我已成功连接到informix数据库。

我还通过VBA成功地从informix服务器导入了一个较小的表,代码如下:

DoCmd.TransferDatabase acImport, "ODBC Database", "ODBC;DSN=My_DSN_Name;UID=odbc;PWD=My_PWD;LANGUAGE=us_english;" & "DATABASE = My_DB_Name", acTable, "My_Destination_Tbl_Name", "TestTableImport", False, True

我理想的解决方案是看到访问数据库的最终用户按下一个按钮,该按钮更新数据库的本地访问副本,并自上次更新以来对informix数据库进行了所有更改。

我对访问和VBA的经验有限,所以我真的很感激任何有关我应该如何进行的指示。也许我忽略了一些简单的事情?

感谢阅读和您提供的任何建议,

约翰

1 个答案:

答案 0 :(得分:0)

嗯......假设表中的数据是静态的(没有列数据的更新,只是新行)你可以做一些事情,比如在Access中导入你想要的任何数据子集,然后每次单击按钮运行一个宏来检查访问表中的最新行。 使用该信息仅从ODBC源中选择新行并将其插入访问表中。

我尝试使用Access 2013:

Sub test()
    Dim cnDB As New ADODB.Connection
    Dim rsRecords As New ADODB.Recordset

    ' find last row

    Set db = CurrentDb
    strSQL = "SELECT TOP 1 empno As lastemp FROM informix_employee ORDER BY empno DESC"
    Set rs = db.OpenRecordset(strSQL, dbOpenSnapshot)
    lastemp = rs("lastemp")
    rs.Close

    ' get new rows from odbc source
    DoCmd.SetWarnings False
    cnDB.Open "DSN=ids1210;uid=informix;pwd=password"
    rsRecords.Open "Select * from employee where empno>" & lastemp, cnDB
    Do While Not rsRecords.EOF
      strNaam = rsRecords.Fields(0).Value
      rsRecords.MoveNext

      ' update access table
      DoCmd.RunSQL ("insert into informix_employee (empno) values ('" + strNaam + "')")
    Loop

    rsRecords.Close
    Set rsRecords = Nothing
    cnDB.Close
    Set cnDB = Nothing
    db.Close

End Sub

这是一个基本的例子,但应该让你知道如何做到这一点。 上面的代码每行只插入一列(empno),你需要遍历你的表并使用所有列进行插入(基本上为你的表创建insert .............语句)

' informix_employee'是Access表。

'雇员'是Informix表。

此外,您需要引用ADO,例如' Microsoft ActiveX Data Objects 6.1'让它工作,否则它将失败,因为ADODB对象不会在那里。

如果Informix表确实获得了一些列更新(而不仅仅是新行),那将非常困难,因为没有任何内容(IDS / ODBC / Access)能够告诉您哪些行已更新而未获取数据并进行比较与之前的一套。