使用每日更新的Access表自动刷新SQL Server后端
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用每日更新的Access表自动刷新SQL Server后端相关的知识,希望对你有一定的参考价值。
简介:我有一个本地Access数据库,其中包含订单,并且每天早上由Windows任务启动的自动VBA例程进行更新。详细地说,每天都会添加新订单,并使用本地.csv
文件使用新信息更新现有订单,该文件在早上5:30凌晨放在共享文件夹环境中。
现在,我有一个SQL Server,它需要是最新的,并且是本地表的精确副本,最好是在本地更新完成后。这是必要的,因为我使用SQL Server作为自动订单分发工具的后端,将来大约50名员工将使用它。
我尝试过:我完全在本地表上运行本地更新例程,本地表一直都是本地表,以确保顺利更新过程。为了更新SQL表,我尝试通过创建链接表来实现它,但是,数据集不会传输到SQL Server。这很奇怪,因为当我在链接表中手动更改单个字段时,更改会立即反映在SQL Server表中。它只是基于VBA的进程,未在SQL Server中更新。
码:
Sub Sync_SQL()
Dim myDB As DAO.Database
Set myDB = CurrentDb
Dim strSQL As String
Dim qdf As QueryDef
' Erstellt einen temporären Query mit einem ODBC-Connection String zur Verbindung mit dem SQL Server
Set qdf = CurrentDb.CreateQueryDef("SyncDB")
qdf.Connect = "ODBC;Driver={SQL Server};server=XX.X.XXX.XX;database=OPM;uid=USID;pwd=PWD;"
' Löscht alle noch offenen Aufträge aus dem SQL-Server
qdf.SQL = "DELETE FROM [OPM].[dbo].[ReiseMaster] WHERE NOT [Name of Employee] = '---------';"
qdf.ReturnsRecords = False
' Führt den Query aus und misachtet dabei jegliche Dialogfelder
DoCmd.SetWarnings False
DoCmd.OpenQuery "SyncDB"
DoCmd.SetWarnings True
' Fügt aktuell offene Aufträge in den SQL-Server ein
myDB.Execute "INSERT INTO [dbo_ReiseMaster] SELECT * FROM [ReiseMaster] WHERE NOT [Name of Employee] = '---------';"
' Leert den Statistik-Table (sollte in Zukunft anders funktionieren)
qdf.SQL = "DELETE FROM [OPM].[dbo].[Statistics];"
qdf.ReturnsRecords = False
' Führt den Query aus und misachtet dabei jegliche Dialogfelder
DoCmd.SetWarnings False
DoCmd.OpenQuery "SyncDB"
DoCmd.SetWarnings True
' Lädt den Statistik-Table mit den neuen Werten hoch (sollte in Zukunft nur noch für neue Aufträge erfolgen, um Performance auch nach längerer Laufzeit der Datenbank gering zu halten)
myDB.Execute "INSERT INTO [dbo_Statistics] SELECT * FROM [Statistics];"
' Setzt die aktive Verbindung zurück und löscht den temporären Query
Set qdf = Nothing
myDB.QueryDefs.Delete "SyncDB"
myDB.QueryDefs.Refresh
End Sub
结果:特别是,链接表的以下更改将不会反映在SQL Server中:
myDB.Execute "INSERT INTO [dbo_ReiseMaster] SELECT * FROM [ReiseMaster] WHERE NOT [Name of Employee] = '---------';"
虽然Access文件中的链接表dbo_ReiseMaster
包含更新的值,但它们不会上载到SQL Server。
如何确保本地Access表(我将以何种方式操作数据)始终将更改传输到SQL Server?
您不能使用单个连接对象,然后“希望”该访问知道要使用的表。您在单个连接对象上执行sql,因此插入和源表将驻留在该远程连接上。你不能这样做。
如果源表存在于sql server端会发生什么?
但是,转储所有查询连接的东西。只需将表链接到服务器即可。
您现在可以从访问中编写和使用标准sql,并使用这两个表,就好像它们是本地的一样。
所以,你可以去:dim strSQL as string
strSQL = "INSERT INTO [ReiseMasterLinked] " & _
"SELECT * FROM [ReiseMaster] WHERE NOT [Name of Employee] = '---------';"
currentdb.Execute strSQL
因此,您可以对两个表使用sql,即使一个表链接到sql server,但您必须使用链接表。您不处理,查看或使用连接对象,因为它始终适用于一个连接对象。但是,Access非常特别,因为您可以编写包含链接表和本地表的sql - 它将解析两个表所基于的连接(或者实际上一个表未链接是本地的,另一个表是链表。
Edit
这是另一个例子。但请注意我如何注释掉.Execute命令,并将其替换为docmd.RunSQL。
Sub AppendTest()
Dim strSQL As String
strSQL = "INSERT INTO tblHotelsSQL " & _
"SELECT * FROM tblHotelsLOCAL WHERE NOT tblHotelsLOCAL.HotelName = '-----'"
'CurrentDb.Execute strSQL, dbFailOnError
DoCmd.RunSQL strSQL
End Sub
这样运行速度较慢,并将命令包装在事务中 - 因此您可以对提示回答“是”或“否”,但它会提供更详细的错误消息,说明查询无法或未运行的原因。再次注意,不需要连接字符串。对于上面的工作,可以快速双击链接表到SQL服务器,以确保链接表一切正常(如果它显示数据 - 也许尝试编辑一行 - 移动,这将确保链表是读/写的。
以上是关于使用每日更新的Access表自动刷新SQL Server后端的主要内容,如果未能解决你的问题,请参考以下文章