问题:
我正在尝试将表的部分从远程informix导入access 2016数据库。要部分导入的表包含帐户信息,大于2GB(据我所知,这是access db的最大大小)。
我只需要去年的信息,这是远远少于2GB,但信息必须更新在每一天结束。
我在网上看到的两个解决方案是:
(A)链接表:
我不愿意这样做有两个原因:
1)我不希望每次access db的enduser运行报告时都将额外的负载放在服务器上。
2)我不希望access DB中的任何更改转到实时informix (这绝对是残酷的)
(B)通过access GUI复制整个表
我认为这不是一个可行的解决办法,原因如下:
1)表大于2GB
( 2)报告必须每天在桌面上运行,并提供每日更新的信息。这需要每天将整个informix表拖到access中。
工作到目前为止:
通过为informix创建dsn,我成功地从access连接到informix。
我还成功地使用以下代码从informix服务器通过VBA导入了一个较小的表:
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
我的理想解决方案是看到access db的enduser按一个按钮,用上次更新以来对informix所做的所有更改来更新数据库的本地访问副本。
我在access和VBA方面的经验有限,所以我非常感谢任何关于我应该如何进行的指导。也许我忽略了一些简单的东西?
谢谢你的阅读和你能提供的建议,
约翰
发布于 2017-08-09 07:13:39
嗯..。假设表中的数据是静态的(不更新列数据,只更新新行),您可以在Access中导入您想要的任何数据子集,然后每次单击按钮时运行宏来检查access表中的最新行。使用该信息只从ODBC源中选择新行,并将它们插入access表中。
我试用了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),您将需要遍历您的表并对所有列进行插入(基本上创建插入.(表的语句)
'informix_employee‘是访问表。
‘'employee’是Informix表。
此外,您还需要引用ADO。‘数据对象6.1’使其工作,否则它将失败,因为ActiveX对象将不存在。
如果Informix表确实获得了一些列更新(不仅仅是新行),这将非常困难,因为没有任何(IDS/ODBC/Access)能够告诉您哪些行是更新的,而不需要获取数据并将其与上一组进行比较。
https://stackoverflow.com/questions/45570803
复制