从Oracle数据库到SQL Server数据库主键的迁移[1]

[入库:2005年8月18日] [更新:2007年3月24日]

本文简介:选择自 hnxyy 的 blog

由于项目需要要将以前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+''''+

本文关键:从Oracle数据库到SQL Server数据库主键的迁移
  相关方案
Google
 

本站最佳浏览方式为 分辨率 1024x768 IE 6.0(或更高版本的 IE浏览器)

go top