网站首页
JSP空间
动态资讯
开源项目
技术文档
资源下载
J2EE资源
客户论坛
在线支付
 
  技术文档>>数据库技术>>Oracle技术>>Oracle开发>查看文档  
  实例讲解oracle到sql server主键的迁移     
  文章作者:未知  文章来源:赛迪网技术社区  
  查看:52次  录入:管理员--2008-05-14  
 

【赛迪网-it技术报道】这篇论坛文章(赛迪网技术社区)主要介绍了oracle数据库到sql server数据库主键的迁移过程,具体内容请参考下文。

由于项目需要要将以前oracle的数据库转化为sql server,今天利用sql server的dtd进行数据库的迁移,但导入以后发现只导入了表结构和数据,而表的一些主键约束都没导过来,感觉很郁闷,而手头又没有好的迁移工具,如erwin,所以动手写了个小工具,基本实现了主键的转移,主要代码如下:

主要控件:

adoconnorcale: tadoconnection; //连接oracle

adoconnsqlserver: tadoconnection; //连接sql server

o1: tadoquery; //连接oracle

s1: tadoquery; //连接sql server

s2: tadoquery; //连接sql server

progressbar1: tprogressbar; //进度条

memo1: tmemo; //显示出错信息

edtserver: tedit; //服务器

edtdatabase: tedit; //数据库名称

edtuser: tedit; //用户名

edtpass: tedit; //口令

button1: tbutton; //执行按钮

//常量

const

oraconnstr='provider=msdaora.1;data source=%s;user id=%s;password=%s;persist security info=true';

sqlconnstr='provider=sqloledb.1;data source=%s;initial catalog=%s;user id=%s;password=%s;persist security info=false';

在执行前先进行oracle和sql server数据库的连接。

连接oracle:

adoconnorcale.connectionstring :=format(oraconnstr,[trim(edtdatabase.text),

trim(edtuser.text),trim(edtpass.text)]);

try

adoconnorcale.open;

msgbox('oracle数据库连接成功!');

except

msgbox('oracle数据库连接失败!');

end;

连接sql server:

adoconnsqlserver.connectionstring :=format(sqlconnstr,[trim(edtserver.text),

trim(edtdatabase.text),trim(edtuser.text),trim(edtpass.text)]);

try

adoconnsqlserver.open;

msgbox('sql server数据库连接成功!')

except

msgbox('sql server数据库连接失败!');

end;

主要执行代码,比较乱,没有整理,不过实现功能就行了。

procedure tform1.button1click(sender: tobject);

var

i:integer;

fieldn, tablen, fieldm,aa:string;

begin

if not adoconnorcale.connected then

begin

msgbox('请先连接oracle数据库!');

exit;

end;

if not adoconnsqlserver.connected then

begin

msgbox('请先连接sql server数据库!');

exit;

end;

screen.cursor :=crhourglass;

try

o1.close;

o1.sql.clear;

//取oracle表用户budget的所有主键约束信息

o1.sql.text :=' select a.constraint_name,a.constraint_type,a.table_name, b.column_name,b.position '+

' from user_constraints a,user_cons_columns b where a.constraint_name=b.constraint_name '+

' and a.table_name=b.table_name and constraint_type=''p'' and a.owner=b.owner '+

' and lower(a.owner)=''budget'' order by a.table_name,b.position ';

o1.open;

tablen:='';

o1.first;

progressbar1.max:=o1.recordcount;

progressbar1.min:=0;

progressbar1.step:=1;

progressbar1.visible :=true;

for i:=0 to o1.recordcount -1 do

begin

s2.close;

s2.sql.clear;

//判断sql server表是否存在当前的字段信息

s2.sql.text:='select a.name as tanme, b.* from sysobjects a inner join '+

' syscolumns b on a.id = b.id '+

' where (a.xtype = ''u'') and (a.name = '''+o1.fieldbyname('table_name').asstring+''''+

') and b.name= '''+o1.fieldbyname('column_name').asstring+''''+

' order by b.id';

s2.open;

//不存在,输出表明和字段名

if s2.recordcount<=0 then

begin

memo1.text:=memo1.text+#13+'表:'''+o1.fieldbyname('table_name').asstring+''''+

' 字段:'''+o1.fieldbyname('column_name').asstring+''' 不存在!';

o1.next;

tablen:='';

fieldn:='';

continue;

end;

//是当前表,循环读取主键信息

if (tablen='') or (tablen= o1.fieldbyname('table_name').asstring) then

begin

fieldn:=fieldn+'['+o1.fieldbyname('column_name').asstring+'],';//表明相同或初试时

tablen:= o1.fieldbyname('table_name').asstring;

end

else

begin

with s1 do

begin

try

//取sql server表的主键信息

close;

sql.clear;

sql.text:='select * from information_schema.key_column_usage where table_name='''+tablen+'''';

open;

first;

aa:=fieldbyname('constraint_name').asstring;

//如果该主键在sql表中已存在,删除该主键信息,重建该表主键

if recordcount>0 then

begin

sql.clear;

sql.text:='alter table '+tablen+' drop constraint '+aa; //删除主键

execsql;

end;

sql.clear; //column_name

sql.text:='alter table '+tablen+' with nocheck add '+

' constraint [pk_'+tablen+'] primary key nonclustered '+

' ( '+ copy(fieldn,1,length(fieldn)-1)+

' )';

execsql;

fieldn:='['+o1.fieldbyname('column_name').asstring+'],';

tablen:= o1.fieldbyname('table_name').asstring;

except

memo1.text :=memo1.text+'表: '+tablen+' 字段: '+fieldn+' 导入出错!';

exit;

end;

end;

end;

progressbar1.stepit;

application.processmessages;

o1.next;

end;

msgbox('导入完成!');

finally

screen.cursor :=crdefault;

progressbar1.visible :=false;

end;

end;

 
 
上一篇: 相同软件环境下oracle9i数据库迁移方法    下一篇: 数据库迁移的几种常用方式及优缺点比较
  相关文档
比较部分联机备份和常规操作生成的redo 03-05
undo表空间暴长后如何才能取消自动扩展 04-18
教你删除oracle数据库中重复没用的数据 09-10
解析:oracle热备期间过量redo生成控制 11-15
讲解为用户提供对回滚操作时间准确评估 06-10
用Oracle 9i全索引扫描快速访问数据 04-11
教你快速掌握oracle数据库结构的16个要点 04-15
未来的数据库将构筑在网格计算的环境之上 02-18
如何确定Oracle数据库表中重复的记录 01-15
带你快速了解oracle数据库提供的恢复机制 05-05
带你深入的了解执着并购中的--甲骨文 11-15
去掉数据库的初始化参数即可禁用xdb服务 03-05
解析:怎样使用oracle的decode()函数 11-15
逐步讲解 Oracle数据库碎片如何整理 05-13
关于Oracle中执行计划稳定性深入研究 04-11
教你轻松掌握statspack报表的使用方法 (1) 06-24
决定用户对全部对象名引用的三种数据库链 02-28
详细讲述Oracle中的to_date参数含义 05-27
教你轻松掌握数据库和实例的启动和关闭 09-29
轻松掌握oralce数据库常用预定义的例外 04-03
返回首页 | 关于我们 | J网章程 | JSP空间合租 | 客服中心 | 免责声明 | 常见问题 | 参观机房
本站主机空间代理至厦门市华众网络科技有限公司
《中华人民共和国增值电信业务经营许可证》
编号:闽B2-20050079
@2005-2008福建JSP技术网 版权所有 闽ICP备05000928号
厦门(总部):13616026886 福州:0591-87655121
邮箱:admin@fjjsp.com 站长QQ,点击这里给我发消息