将部分 table 从远程数据库导入本地 Microsoft Access 数据库
Import partial table from remote DB into a local microsoft access DB
问题:
我正在尝试将 table 的 部分 从远程 informix 数据库导入到 access 2016 数据库中。要部分导入的 table 包含帐户信息并且大于 2 GB(据我了解,这是访问数据库的最大大小)。
我只需要去年的信息,不到 2 GB,但信息必须在每天结束时更新。
我在网上看到的两种解决方案是:
(A) Link tables:
我不愿意这样做有两个原因:
1) 我不希望访问数据库的最终用户每次运行报告时都给服务器增加额外的负载。
2) 我不希望在访问数据库中执行的任何更改都转移到实时的 informix 数据库中(这绝对是至关重要的)
(B) 通过访问 GUI
复制整个 table
我认为这不是一个可行的解决方案,原因如下:
1) table 超过 2GB
2) 报告必须 运行 每天 table 每天更新信息。这将需要每天将整个 informix table 拉入访问。
目前工作:
我已经通过为 informix 数据库创建一个 dsn 成功地连接到 informix 数据库。
我还使用以下代码通过 VBA 从 informix 服务器成功导入了一个较小的 table:
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 方面的经验有限,所以非常感谢任何关于我应该如何进行的指示。也许我忽略了一些简单的事情?
感谢阅读以及您可以提供的任何建议,
约翰
嗯……假设 table 中的数据是静态的(没有更新列数据,只有新行)你可以做一些事情,比如在 Access 中导入你想要的任何数据子集,然后每个当您单击按钮时 运行 一个宏来检查访问 table 中的最新行是什么。
使用该信息 select 仅来自 ODBC 源的新行并将它们插入访问 table.
我用 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),您需要遍历 table 并对所有列进行插入(基本上是创建插入 .....................您的声明 table)
'informix_employee' 是访问 table.
'employee' 是 Informix table。
此外,您需要引用 ADO,例如'Microsoft ActiveX Data Objects 6.1' 让它工作,否则它将失败,因为 ADODB 对象不存在。
如果 Informix table 确实获得了一些列更新(不仅仅是新行),那将是相当困难的,因为没有任何东西(IDS/ODBC/Access)能够告诉您哪些行在没有更新的情况下进行了更新获取数据并将其与上一组进行比较。
问题:
我正在尝试将 table 的 部分 从远程 informix 数据库导入到 access 2016 数据库中。要部分导入的 table 包含帐户信息并且大于 2 GB(据我了解,这是访问数据库的最大大小)。
我只需要去年的信息,不到 2 GB,但信息必须在每天结束时更新。
我在网上看到的两种解决方案是:
(A) Link tables:
我不愿意这样做有两个原因:
1) 我不希望访问数据库的最终用户每次运行报告时都给服务器增加额外的负载。
2) 我不希望在访问数据库中执行的任何更改都转移到实时的 informix 数据库中(这绝对是至关重要的)
(B) 通过访问 GUI
复制整个 table我认为这不是一个可行的解决方案,原因如下:
1) table 超过 2GB
2) 报告必须 运行 每天 table 每天更新信息。这将需要每天将整个 informix table 拉入访问。
目前工作:
我已经通过为 informix 数据库创建一个 dsn 成功地连接到 informix 数据库。
我还使用以下代码通过 VBA 从 informix 服务器成功导入了一个较小的 table:
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 方面的经验有限,所以非常感谢任何关于我应该如何进行的指示。也许我忽略了一些简单的事情?
感谢阅读以及您可以提供的任何建议,
约翰
嗯……假设 table 中的数据是静态的(没有更新列数据,只有新行)你可以做一些事情,比如在 Access 中导入你想要的任何数据子集,然后每个当您单击按钮时 运行 一个宏来检查访问 table 中的最新行是什么。 使用该信息 select 仅来自 ODBC 源的新行并将它们插入访问 table.
我用 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),您需要遍历 table 并对所有列进行插入(基本上是创建插入 .....................您的声明 table)
'informix_employee' 是访问 table.
'employee' 是 Informix table。
此外,您需要引用 ADO,例如'Microsoft ActiveX Data Objects 6.1' 让它工作,否则它将失败,因为 ADODB 对象不存在。
如果 Informix table 确实获得了一些列更新(不仅仅是新行),那将是相当困难的,因为没有任何东西(IDS/ODBC/Access)能够告诉您哪些行在没有更新的情况下进行了更新获取数据并将其与上一组进行比较。