MS Access互操作 – 数据导入

我正在使用exe来将SQL导出到Access,我们不想使用DTS,因为我们有多个客户端,每个客户端都导出不同的视图,并且设置和维护DTS包的开销太大。

*编辑:这个过程每晚都为许多客户自动化,因此整个过程必须在存储过程中的游标内启动和控制。 这是因为必须按导出的每个项目过滤数据。

我已经尝试了很多方法将数据从SQL中导入Access,最有希望的是使用Access互操作并运行

doCmd.TransferDatabase(Access.AcDataTransferType.acImport... 

我遇到了一个问题,我从视图导入,并手动运行导入,似乎视图没有开始足够快地返回数据,因此访问弹出一个MessageBox对话框,说它已超时。 我认为这也发生在互操作中,但因为它是隐藏的,所以方法永远不会返回!

有什么方法可以阻止弹出这个消息,或者增加导入命令的超时时间?

我目前的攻击计划是将视图展平为一个表,然后从该表导入,然后删除展平的表。

很高兴有任何建议如何解决这个问题。

编辑:

关于我在做什么的进一步信息:

我们有多个客户,每个客户都有一个标准的数据模型。 其中一个“模块”是访问导出器(sproc)。 它读取要从参数表导出然后导出的视图。 视图按项目过滤,并为每个项目创建一个访问文件(每个视图都有项目字段)

我们正在运行SQL 2005并且没有快速转向SQL 2005,我们可能会在几个月后跳到2008年。

然后我们有一个模块执行作业,它在每个数据库上执行配置的模块。 在此模块执行中有许多导入/导出/其他作业,并且访问导出器必须能够适合此框架。 所以我需要一个通用的SQL – > Access导出器,可以通过我们的参数框架进行配置。

目前sproc调用我写的exe,我的exe通过interop打开访问,我知道这对服务器不好但是模块执行被写入所以一次只执行一个模块,所以程序永远不会运行更多一次只有一个例子。

你尝试过使用VBA吗? 您有更多选项配置连接,我确信我在过去的上下文中使用了超时调整。

另外,我一般认为最简单的方法就是直接查询视图(只要你可以连接一个nolock,或者容忍转移需要多长时间); 这可能是创建中间临时表的一个很好的理由。

对于这种东西,在单用户模式下明确打开Acces可能也有好处。

我们使用ADO完成此操作以连接源数据和目标数据。 您可以根据需要设置连接和命令超时值,并读取/附加到每个记录集。

没有特别快,但我们能够让它一夜之间运行

我已经找到了解决这个问题的方法。

http://support.microsoft.com/kb/317114介绍了启动访问过程的基本步骤。

我已经使Process成为一个类变量,而不是ShellGetApp方法的局部变量。 这种方式当我调用Quit函数进行访问时,如果由于某种原因它没有关闭我可以显式地终止进程。

 app.Quit(Access.AcQuitOption.acQuitSaveAll); if (!accessProcess.HasExited) { Console.WriteLine("Access did not exit after being asked nicely, killing process manually"); accessProcess.Kill(); } 

然后我在这里使用了一个方法超时函数来给访问调用一个超时。 如果它超时我也可以杀死访问进程(超时可能是由于弹出一个对话框窗口而我不希望进程永远挂起。我在这里得到了超时方法。

实现C#通用超时

我很高兴你有一个适合你的解决方案。 为了其他人阅读本文的好处,我会提到SSIS可能是解决这个问题的可能方法。 请注意,SSIS和DTS之间的差异几乎是白天和黑夜。

参数化导出过程并不困难,因此对于每个客户端,您可以导出不同的视图集。 您可以遍历包含视图名称的文本文件的行,或者使用针对配置数据库的查询来获取视图列表。 其他参数可以来自相同的配置数据库,基于每个客户端和/或每个视图。

如有必要,还可以选择通过执行子进程执行每个客户端的预处理和后处理,或者如果配置了子进程,则执行pacakge。