回答

收藏

MS Access互操作-数据导入

技术问答 技术问答 169 人阅读 | 0 人回复 | 2023-09-14

我正在开发一个将SQL导出到Access的exe,我们不想使用DTS,因为我们有多个客户端,每个客户端都导出不同的视图,并且设置和维护DTS包的开销太大。
* [, V4 v' d2 A9 d2 Y# m' f7 k- E, k*编辑:此过程每天晚上对许多客户都是自动化的,因此必须在存储过程中的游标中启动和控制整个过程。这是因为必须针对每个项目对数据进行过滤才能导出。8 `- E$ ]# p( ^1 n+ n! W
我尝试了多种方法将数据从SQL提取到Access中,最有前途的是使用Access互操作并运行
, |) a: o! ?6 O2 i9 N. s, `doCmd.TransferDatabase(Access.AcDataTransferType.acImport...: c' T1 B' q% C: U# G. ]% w. t
我遇到了一个问题,该问题是我从视图中导入,并手动运行导入,看来该视图还没有足够快地开始返回数据,因此访问会弹出一个MessageBox对话框,表明它已超时。我认为这也在互操作性中发生,但是因为它是隐藏的,所以该方法永远不会返回!
# w7 D& `3 `; K我有什么办法可以防止此消息弹出或增加import命令的超时?4 t! Z1 Z* P0 ?% ?
我当前的攻击计划是将视图展平到一个表中,然后从该表中导入,然后删除展平的表。6 r$ m$ v+ p5 y0 `0 V
对于如何解决此问题的任何建议感到高兴。
0 b, L/ @' n! q! j# m7 s9 P编辑:
7 r9 ]1 M2 ]2 D6 G有关我在做什么的更多信息:
' V1 Z  |8 y$ K4 o1 g$ ^我们有多个客户端,每个客户端都有一个标准的数据模型。“模块”之一是访问导出器(sproc)。它从参数表中读取要导出的视图,然后导出。视图按项目过滤,并为每个项目创建一个访问文件(每个视图都有项目字段)% B8 U6 W: F, I+ `8 u% w/ ^' p) S
我们正在运行SQL 2005,但并没有很快迁移到SQL 2005,我们可能会在短短几个月内跳到2008年。- b8 _$ x  Y0 N7 _( ~
然后,我们有一个模块执行作业,该作业在每个数据库上执行已配置的模块。在此模块执行中运行许多导入/导出/其他作业,并且访问导出器必须能够适合此框架。因此,我需要一个通用的SQL->
1 Z$ m2 P' ?* J0 H- R8 Y: CAccess导出器,可以通过我们的参数框架进行配置。/ |# K5 K; l1 P. @8 R, k. V0 G! o
当前sproc调用我编写的exe,我的exe通过互操作打开访问权限,我知道这对服务器不利,但是模块执行被编写,因此一次仅执行一个模块,因此该过程将永远不会运行一次超过一个实例。
0 |: w$ c0 |# d9 L4 w0 F8 \                & ?0 a7 `/ k7 t. Q4 Y) ~+ s, h! t
解决方案:  y1 A: A8 P$ ?+ r/ T
                - E0 L) ~/ v- I* O: m) k

, T# C8 {" S3 c& q4 h
& c2 T+ R* W7 E1 W* R+ V                我已经确定了执行此操作的方法。
9 i& H7 A7 Y# \4 M- r/ w+ O: i# g$ _http://support.microsoft.com/kb/317114描述了启动访问过程的基本步骤。- s6 _! `& N) n) J' \# m
我已将Process设置为类变量,而不是ShellGetApp方法的局部变量。这样,当我调用Quit函数进行访问时,如果由于某种原因而没有关闭,则可以显式终止该进程。4 i3 ]& b5 V) V
app.Quit(Access.AcQuitOption.acQuitSaveAll);0 ?, r' P2 \0 {. T# |  T4 O2 _0 b
if (!accessProcess.HasExited)
' r- O+ r) J% ?2 {7 @& _{
, J, A5 f9 \, J- c* A! `" p, v    Console.WriteLine("Access did not exit after being asked nicely, killing process manually");% E3 ^, a4 h& o, }8 f/ P/ s
    accessProcess.Kill();
% W; V( f& z) _7 H- O# R}0 t6 l" z7 P, J4 S$ {$ ~
然后,我在这里使用了方法超时功能来给访问调用超时。如果超时,我也可以终止访问过程(超时可能是由于弹出的对话框窗口引起的,并且我不希望该过程永远挂起。我在这里得到了超时方法。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则