一个应用需要使用局域网某部主机提供的数据.由于安全考虑.这个主机只开放了一个共享地址,并给了有权访问的用户名和密码.数据为ACCESS文件.
而我们的应用需要每天定时去访问这个文件.来同步数据.
环境:
1.共享文件形式,提供访问的用户名和密码;
2.文件格式为Access文件;
3.数据需要定时访问,与更新;
4.数据最终存储目标地址为SQLServer数据库
最初:
我们想通过SqlServer DTS包定时执行来导入数据.但不管怎么调试.SQLServer在执行的时报错.报错提示为权限不足.经过分析,SqlServer DTS
导入对于网络共享目录的支持不太好,再深入发现也跟共享目录给的权限有一定关系.这个问题困绕了我们很长时间。在网络上找了很多资料都没解决。
改变方案:
写一个单独导入的程序,在导入之前通过批处理脚本去将文件复制到本地,然后再去导入,然后定出以下几个步骤
1.启用批处理脚本程度
2.复制文件到本地目录
3.调用专门导数据的Exe可执行程序
4.导入成功
经过几步就可实现一次数据导入。可以走通。
接着将这个两个文件部署到服务器中.用windows计划任务来定时执行这个批处理.
部署后倍感开心。总算能实现完整导入。
第二天来公司。打开服务器一看windows计划任务成功执行。然后查询数据库数据。竟然没有导入。空空如也。
是什么问题?然后再手工执行了计划任务,发现一闪而过。也没有错误提示.数据库没有数据.说明导入数据程序没有执行到。
再打开计划任务高级设置。发现一个地方 “起始于” 参数设置然后输入bat的目录地址,再次运行计划任务。成功!
(这里注意:在bat调用其它Exe的时候一定要指定批处理文件的起启位置。否则调不到Exe)
到这里这个导入程序可以实现自动更新了。然而好景不长。由于网络主从切换,程序运行服务器要重新启动。发现重新启动后网络共享地址就没权访问。
需要再次输入用户名和密码,如果网络环境略发生变化就会失败.就不太稳定了.
升级方案
1.启用批处理脚本程度
2.创建一个网络驱动器
3.复制网络驱动器文件到本地目录
4.调用专门导数据的Exe可执行程序
5.删除网络驱动器
6.导入成功
升级方案后加入网络驱动器会指定访问的密码和用户名.不管机器是否为第一次访问都可以连接.(你懂的)
在创建网络驱动器时注意:
/user:机器名/用户名
机器名为远程共享文件的机器名.用户名为远程共享文件的机器用户名
例如:net use M: \\192.168.1.2\TEST "123456" /user:fileserver\administrator
\\192.168.1.2\TEST为共享目录的地址
123456为密码
fileserver 为共享服务器名称
administrator 为共享服务器登陆用户名
脚本如下:
@ECHO OFF
@REM 以下三个变量配置,注意CHT_PATH等号后不能有空格
net use M: \\192.168.1.150\TEST1 "123456" /user:fileserver\administrator
net use N: \\192.168.1.150\TEST2 "123456" /user:fileserver\administrator
@SET CHT_PATH="M:\FUELSCAN.MDB"
@SET HIT_PATH="N:\FUELSCAN.MDB"
@SET SQL_CONN="Server=192.168.1.2;initial catalog=TEST_DB;uid=sa;pwd=sa123;"
@TITLE 作业导数
@ECHO 导入目标机器 %SQL_CONN%
@ECHO CHT文件来源 %CHT_PATH%
@ECHO HIT文件来源 %HIT_PATH%
@ECHO 当前时间:
@DATE /T
@TIME /T
@ECHO 开始复制文件...%CHT_PATH%
@COPY %CHT_PATH% "CHT_HIT\CHT_TEMP.mdb"
@ECHO 开始复制文件...%HIT_PATH%
@COPY %HIT_PATH% "CHT_HIT\HIT_TEMP.mdb"
@ECHO 开始导入数据...
@ECHO 正在导入中...
@CALL SnphkHIT_CHT_Task.exe %SQL_CONN%
net use M: /del
net use N: /del
@ECHO 导入完成