分享

[原创] 使用SQL DTS功能实现从DB/2向SQL Server传输数据

 荷露叮咚 2009-06-02

[原创] 使用SQL DTS功能实现从DB/2向SQL Server传输数据.


www.

【前言】
经过自行测试SQL2000 DTS功能,感觉通过DTS工具从DB/2取数来得很方便、容易实现。现将实施步骤贴出来,以供参考。

【环境】
IBM AS/400e、OS/400、DB/2、 ERP 
IBM PC SERVER、WIN2000 SERVER、 SQL2000

【标题】
《如何使用SQL2000  DTS功能实现从DB/2向SQL Server传输数据?》
下面以LIU/EXECTL(EXECTL)的PF为例,图文并茂进行阐述:

1。首先在Win2000 Server平台安装Client Access/400,并确认ODBC中有“Client Access ODBC Driver(32-bit)”驱动:

[ 本帖最后由 qingzhou 于 2006-5-17 11:12 编辑 ]








 qingzhou 回复于:2004-06-15 16:44:12

2。在Win2000 Server平台安装SQL2000中文标准版,保证SQL服务器管理器相关服务启动后,执行“导入和导出数据”:







 qingzhou 回复于:2004-06-15 16:45:39

3。出现“DTS导入/导出向导”界面,下一步:







 qingzhou 回复于:2004-06-15 16:47:10

4。在数据源中选取“Client Access ODBC Driver(32-bit)”驱动,同时新建“用户/系统DSN”:







 qingzhou 回复于:2004-06-15 16:49:15

5。建立系统数据源:







 qingzhou 回复于:2004-06-15 16:51:13

6。选择“Client Access ODBC Driver(32-bit)”作为数据源驱动程序:







 qingzhou 回复于:2004-06-15 16:55:02

7。点击完成:







 qingzhou 回复于:2004-06-15 16:56:02

8。在弹出的配置窗口中输入“数据源名”和选取系统IP地址(即:AS/400 ip address),同时建议将“SQL缺省库”指定为要操作的库,确定退出当前窗口:












 qingzhou 回复于:2004-06-15 17:03:59

9。然后直接在“用户/系统DSN”栏输入刚才创建的名称,如:EXECTL,并在下面栏输入登陆AS/400的user profile和password(具备足够权限),下一步:







 qingzhou 回复于:2004-06-15 17:07:19

10。“目的”栏选择“用于SQL Server的Microsoft OLE DB提供程序”,下面的“数据库”自行新建一个,如:AS400_Date:







 qingzhou 回复于:2004-06-15 17:09:09

11。指定表的处理类型,此处为“从源数据库复制表和视图”:







 qingzhou 回复于:2004-06-15 17:11:09

12。接着选择要处理的在OS/400上的PF,如:LIU/EXECTL:







 qingzhou 回复于:2004-06-15 17:14:04

13。设置好调度DTS包的时间、执行频率以及保存事项:












 qingzhou 回复于:2004-06-15 17:15:37

14。并给DTS包命名,如:test







 qingzhou 回复于:2004-06-15 17:16:56

15。出现配置摘要,确认无误后点完成:







 qingzhou 回复于:2004-06-15 17:18:31

16。如果上面13步骤“时间”—立即运行,将出现立即运行画面,完成后结果如下:







 qingzhou 回复于:2004-06-15 17:20:22

17。启动SQL“企业管理器”,在“数据转换服务—本地包”中将出现刚才成功创建的DTS包—test:







 qingzhou 回复于:2004-06-15 17:21:49

18。双击test DTS包可以出现下图编辑画面:







 qingzhou 回复于:2004-06-15 17:23:17

19。同时在AS400_Date的表中出现EXECTL的表,进行查询操作查看内容:







 qingzhou 回复于:2004-06-15 17:25:51

20。在下表中可以清楚看到EXECTL的各个字段和记录,至此整个从DB/2→SQL2000数据传输工作全面完成。







 xuguopeng 回复于:2004-06-15 18:02:39

哈哈 第一个顶 这么快就完成了


 mamei 回复于:2004-06-15 18:15:21

呵呵!
这就是取数据,还要做一些相应的处理!


 qingzhou 回复于:2004-06-15 18:23:22

是的,现在是尽量要求客户端软件的后台数据库用这个导出数据,这样工作量就会小些。
或者修正企业的ERP生产系统,让PF文件尽量满足客户端软件的后台接口要求。
解决了取数问题,而且实现了“类似实时”取数功能,所以其它问题解决起来相对简单了。


 mamei 回复于:2004-06-15 18:27:58

我现在正在用ACCESS来取数据!

取实时的数据不太好处理!


 mamei 回复于:2004-06-15 18:32:13

以前还想用ORACLE来实现这个功能!

可惜不懂ORACLE!


 qingzhou 回复于:2004-06-15 18:33:44

引用:原帖由 "mamei" 发表:
我现在正在用ACCESS来取数据!
取实时的数据不太好处理!


"实时"我觉得只是相对问题而言,如果要求很严格,那就要采用触发器的功能了,但这样实施起来不仅增加难度,而且会有所降低系统的性能。
ACCESS本身数据库受限制,不支持超过2G的数据,可以考虑用用SQL或者ORACLE。


 wildfish 回复于:2004-06-16 11:42:22

老大,如果数据量大的确很恐怖。这样机器负载也会相应的增加。
http://www.microsoft.com/china/technet/prodtechnol/sql/2000/deploy/dtssql2k.mspx
建议老大看看dts编程的,看看能否增量的下传数据,呵呵,我知道可以,但是没时间看,所以还是把难题留给老大解决。


 ibmas400 回复于:2004-06-16 15:42:06

qingzhou真是好心人啊。。。
難得。


 kimdai 回复于:2004-06-17 11:35:47

辛苦啊,看看如何自动增量的导入更有价值


 qingzhou 回复于:2004-06-17 15:04:59

引用:原帖由 "wildfish" 发表:
老大,如果数据量大的确很恐怖。这样机器负载也会相应的增加。
http://www.microsoft.com/china/technet/prodtechnol/sql/2000/deploy/dtssql2k.mspx
建议老大看看dts编程的,看看能否增量的下传数据,呵呵,我知?.........


通过SQL2000要访问OS/400上的PF就那么几个,所以不存在数据量很大的问题。
我仔细看DTS包Design窗口,发觉倒是有“大容量插入任务”功能,此功能可以提高访问大容量数据的效率。







 mamei 回复于:2004-06-17 18:22:31

引用:原帖由 "qingzhou"]12。接着选择要处理的在OS/400上的PF,如:LIU/EXECTL:
 发表:



我做到这步就出错!!!







 mamei 回复于:2004-06-17 18:25:13

如果在这里选第二项,
就不会报错!!!







 qingzhou 回复于:2004-06-17 18:27:30

引用:原帖由 "mamei" 发表:


我做到这步就出错!!!


你真是不幸, :D ,我这几天反复做了几遍都没问题。。。
检查SQL2000配置是否正确?
只怕一时讲不明白,SQL安装正常,配置按照步骤走的话应该没问题的。


 mamei 回复于:2004-06-17 18:30:44

是的,
现在只能麻烦一点,

选第二个选项!!

搞不懂是为什么呀!


 qingzhou 回复于:2004-06-17 18:32:40

引用:原帖由 "mamei" 发表:
是的,
现在只能麻烦一点,

选第二个选项!!

搞不懂是为什么呀!


第二选项是提供查询的功能,接着的窗口会让你输入SQL语句。。。
实现的目的不一样的。


 mamei 回复于:2004-06-17 18:38:03

我这边也就是几个表,用SQL连起来一样用!


 wildfish 回复于:2004-06-18 09:29:54

mamei,如果你指定sql的话,你得加上库名,而且还要你的用户有权限查询。你可以把你的sql放在400上面看看能否执行,当然了"."要换成"/"


 qingzhou 回复于:2004-06-21 09:55:07

引用:原帖由 "mamei" 发表:
以前还想用ORACLE来实现这个功能!
可惜不懂ORACLE!


安装完CA/400后,同时会有"OLEDB For db2/400"数据接口方式。
然后在NT上安装数据库Oracle8i,借助"OLEDB for Oracle Net8"配置从DB/2往Oracle转移数据的步骤,一样能够达到目的。


 彩黑 回复于:2004-07-08 14:43:36

两台机器上两个sql数据库要实现同步,按照上面这位大师的方法,初了第一次是导入时正确外,其他时间的数据还是不同哦,在看data transormation services里的dts数据包没运行,sqlserver agent里的jobs也显示该任务没运行,请问各位大师,是怎么回事哦,试了好多方法了都不行,头痛哦,那位帮顶啊????


 彩黑 回复于:2004-07-08 14:45:21

两台机器上两个sql数据库要实现同步,按照上面这位大师的方法,初了第一次是导入时正确外,其他时间的数据还是不同哦,在看data transormation services里的dts数据包没运行,sqlserver agent里的jobs也显示该任务没运行,请问各位大师,是怎么回事哦,试了好多方法了都不行,头痛哦,那位帮顶啊????


 qingzhou 回复于:2004-07-08 16:16:27

引用:原帖由 "彩黑"]两台机器上两个sql数据库要实现同步,按照上面这位大师的方法,初了第一次是导入时正确外,其他时间的数据还是不同哦,在看data transormation services里的dts数据包没运行,sqlserver agent里的jobs也显示该任务没..........


本文的做法是从IBM AS/400往SQL2000推数据,而不是在2台SQL SERVER之间进行数据同步,所以不能混为一谈!

如果要实现2台SQL SERVER实现数据同步,请试试下面办法:

《定时同步SQL服务器上的数据》

--测试环境:SQL Server2000,远程服务器名: xz,用户名为:sa,无密码,测试数据库:test

--服务器上的表(查询分析器连接到服务器上创建)
create table [user](id int primary key,number varchar(4),name varchar(10))
go

--以下在局域网(本机操作)
--本机的表,state说明:null 表示新增记录,1 表示修改过的记录,0 表示无变化的记录
if exists (select * from dbo.sysobjects where id = object_id(N'[user]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
 drop table [user]
GO
create table [user](id int identity(1,1),number varchar(4),name varchar(10),state bit)
go

--创建触发器,维护state字段的值
create trigger t_state on [user]
after update
as
update [user] set state=1
from [user] a join inserted b on a.id=b.id
where a.state is not null
go

--为了方便同步处理,创建链接服务器到要同步的服务器
--这里的远程服务器名为: xz,用户名为:sa,无密码
if exists(select 1 from master..sysservers where srvname='srv_lnk')
 exec sp_dropserver 'srv_lnk','droplogins'
go
exec sp_addlinkedserver  'srv_lnk','','SQLOLEDB','xz'
exec sp_addlinkedsrvlogin 'srv_lnk','false',null,'sa'
go

--创建同步处理的存储过程
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[p_synchro]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
 drop procedure [dbo].[p_synchro]
GO
create proc p_synchro
as
--set  XACT_ABORT on
--启动远程服务器的MSDTC服务
--exec master..xp_cmdshell 'isql /S"xz" /U"sa" /P"" /q"exec master..xp_cmdshell ''net start msdtc'',no_output"',no_output

--启动本机的MSDTC服务
--exec master..xp_cmdshell 'net start msdtc',no_output

--进行分布事务处理,如果表用标识列做主键,用下面的方法
--BEGIN DISTRIBUTED TRANSACTION
 --同步删除的数据
 delete from srv_lnk.test.dbo.[user]
  where id not in(select id from [user])

 --同步新增的数据
 insert into srv_lnk.test.dbo.[user]
 select id,number,name from [user] where state is null
 
 --同步修改的数据
 update srv_lnk.test.dbo.[user] set
  number=b.number,name=b.name
 from srv_lnk.test.dbo.[user] a
  join [user] b on a.id=b.id
 where b.state=1
 
 --同步后更新本机的标志
 update [user] set state=0 where isnull(state,1)=1
--COMMIT TRAN
go

--创建作业,定时执行数据同步的存储过程
if exists(SELECT 1 from msdb..sysjobs where name='数据处理')
 EXECUTE msdb.dbo.sp_delete_job @job_name='数据处理'
exec msdb..sp_add_job @job_name='数据处理'

--创建作业步骤
declare @sql varchar(800),@dbname varchar(250)
select @sql='exec p_synchro'   --数据处理的命令
 ,@dbname=db_name()   --执行数据处理的数据库名

exec msdb..sp_add_jobstep @job_name='数据处理',
 @step_name = '数据同步',
 @subsystem = 'TSQL',
 @database_name=@dbname,
    @command = @sql,
 @retry_attempts = 5,   --重试次数
 @retry_interval = 5    --重试间隔

--创建调度
EXEC msdb..sp_add_jobschedule @job_name = '数据处理', 
 @name = '时间安排',
 @freq_type = 4,     --每天
 @freq_interval = 1,    --每天执行一次
 @active_start_time = 00000  --0点执行
go

[ 本帖最后由 qingzhou 于 2006-2-5 21:09 编辑 ]


 彩黑 回复于:2004-07-08 17:58:35

如果是大量的数据表呢?按照这样的方式是不是要用分析器写语句来执行数据同步啊,因为我对数据库不是很了解,可能一下子没理解你说呢,我还在学习当中,所以如果误解的地方请谅解。 :D


 mario663 回复于:2006-02-05 15:09:33

可不可以实现同步了,SQL 修改数据后在传回去呀!


 utirei 回复于:2006-02-05 15:57:32

楼主辛苦了!!!
提个问题哦pc db2+db2/400会如何呢?
是不是会更简单?


 qingzhou 回复于:2006-02-05 21:30:08

引用:原帖由 utirei 于 2006-2-5 15:57 发表
楼主辛苦了!!!
提个问题哦pc db2+db2/400会如何呢?
是不是会更简单? 


考虑已经购买了SQL LICENSE以及实际环境问题,所以目前本地EDI系统在PC端处理最终采用了VB+SQL2000 —> DB2/400 的处理办法。


 sleepalong 回复于:2006-07-26 10:01:34

google到楼主的帖子,正好有一个问题请教

我按照楼主的设置做了DTS从AS400上导数据导SQL Server下来.单纯的执行DTS包没问题;问题出现作业调度DTS时不能从AS400上导入数据,看症状似乎是两者没有通信,还请楼主帮忙分析一下


 qingzhou 回复于:2006-07-26 16:16:00

引用:原帖由 sleepalong 于 2006-7-26 10:01 发表
google到楼主的帖子,正好有一个问题请教

我按照楼主的设置做了DTS从AS400上导数据导SQL Server下来.单纯的执行DTS包没问题;问题出现作业调度DTS时不能从AS400上导入数据,看症状似乎是两者没有通信,还请楼主帮忙 ... 


出现什么提示???


 sleepalong 回复于:2006-07-27 10:16:41

引用:原帖由 qingzhou 于 2006-7-26 16:16 发表

出现什么提示??? 



什么提示都没有,所以才觉得无从下手.感觉是一直死在那里

另外看到一些资料说,有可能是SQL Server Agent没有这个包所要访问的资源的权限,目前因为一些原因不能测试.不知道是否是因此原因.


 tonyone_wyx 回复于:2006-09-13 14:36:36

我用上面的方法汉字转换后是乱码,应该如何处理?


 qingzhou 回复于:2006-09-13 20:20:46

引用:原帖由 tonyone_wyx 于 2006-9-13 14:36 发表
我用上面的方法汉字转换后是乱码,应该如何处理? 


检查400端PF的OBJECT的CCSID和LANGID是否为935/CHS。


 gpm1xf 回复于:2006-09-13 20:48:21

QINGZHOU你现在在哪里?告诉我联系方法?


 tonyone_wyx 回复于:2006-09-15 09:13:14

CCSID不是935应该如何处理?不会再建个同样的935的数据库吧?


 =AS400= 回复于:2006-10-17 19:19:58

:D如何实现增量的数据传输啊?老大帮我们看下吧!!


 frankshu 回复于:2007-01-09 13:36:19

dts如何控制访问权限?

[ 本帖最后由 qingzhou 于 2007-1-9 17:10 编辑 ]


 qingzhou 回复于:2007-01-09 17:10:32

引用:原帖由 frankshu 于 2007-1-9 13:36 发表
dts如何控制访问权限? 


实质就是控制ODBC访问数据库权限。

本版面也有帖子讨论,具体可参考:
http://bbs./viewthread.php?tid=883299&extra=page%3D1

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多