我正在使用exe来将SQL导出到Access,我们不想使用DTS,因为我们有多个客户端,每个客户端都导出不同的视图,并且设置和维护DTS包的开销太大。
*编辑:此过程每晚都为许多客户端自动执行,因此必须在存储过程中的游标内启动并控制整个过程。这是因为必须按导出的每个项目过滤数据。
我尝试了很多方法将数据从SQL中导入Access,最有希望的是使用Access互操作并运行
doCmd.TransferDatabase(Access.AcDataTransferType.acImport...
我遇到了一个问题,我从视图导入,并手动运行导入,似乎视图没有开始足够快地返回数据,因此访问弹出一个MessageBox对话框,说它已经超时。 我认为这也是在互操作中发生的,但是因为它是隐藏的,所以方法永远不会返回!
有什么方法可以阻止弹出这个消息,或者增加导入命令的超时时间?
我目前的攻击计划是将视图展平为表格,然后从该表格导入,然后删除展平的表格。
很高兴有任何建议如何解决这个问题。
编辑:
关于我在做什么的进一步信息:
我们有多个客户端,每个客户端都有一个标准数据模型。其中一个“模块”是访问导出器(sproc)。它读取要从参数表导出然后导出的视图。视图按项目过滤,并为每个项目创建一个访问文件(每个视图都有项目字段)
我们正在运行SQL 2005并且没有快速迁移到SQL 2005,我们可能会在几个月后跳到2008年。
然后我们有一个模块执行作业,它在每个数据库上执行配置的模块。在此模块执行中有许多导入/导出/其他作业,并且访问导出器必须能够适合此框架。所以我需要一个通用的SQL - >访问导出器,可以通过我们的参数框架进行配置。
目前sproc调用我写的exe,我的exe通过interop打开访问,我知道这对服务器不好但是模块执行被写入所以一次只执行一个模块,所以程序永远不会一次运行多个实例。
答案 0 :(得分:1)
您是否尝试过使用VBA?您有更多选项配置连接,我确信我在过去的上下文中使用了超时调整。
另外,我一般认为最简单的方法就是直接查询视图(只要你可以连接一个nolock,或者容忍转移需要多长时间);这可能是创建中间临时表的一个很好的理由。
对于这种东西,在单用户模式下明确打开Acces可能也有好处。
答案 1 :(得分:1)
我们使用ADO连接到源数据和目标数据。您可以根据需要设置连接和命令超时值,并读取/附加到每个记录集。
没有特别快,但我们能够让它一夜之间运行
答案 2 :(得分:1)
我已经确定了这样做的方法。
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();
}
然后我在这里使用了方法超时功能来为访问调用提供超时。如果它超时我也可以终止访问过程(超时可能是由于弹出一个对话框窗口,我不希望该进程永远挂起。我在这里得到了超时方法。
答案 3 :(得分:0)
我很高兴你有一个适合你的解决方案。为了其他人阅读本文的好处,我会提到SSIS可能是解决这个问题的可能方法。请注意,SSIS和DTS之间的区别几乎是白天和黑夜。
参数化导出过程并不困难,因此对于每个客户端,您可以导出不同的视图集。您可以遍历其中包含视图名称的文本文件的行,或者使用针对配置数据库的查询来获取视图列表。其他参数可以来自相同的配置数据库,基于每个客户端和/或每个视图。
如果有必要,还可以选择通过执行子进程执行每个客户端的预处理和后处理,或者如果已配置,则执行pacakge。