国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 數據庫 > Oracle > 正文

從Oracle數據庫到SQL Server數據庫主鍵的遷移

2024-08-29 13:28:47
字體:
來源:轉載
供稿:網友
由于項目需要要將以前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;

中國最大的web開發資源網站及技術社區,
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 泰顺县| 浪卡子县| 嘉峪关市| 鄂尔多斯市| 蓬莱市| 抚松县| 深州市| 通江县| 景泰县| 游戏| 台江县| 青川县| 芦溪县| 北宁市| 雅江县| 襄城县| 三江| 临泉县| 漾濞| 定南县| 静宁县| 乌兰察布市| 武定县| 读书| 吴旗县| 台南市| 彝良县| 宜良县| 大城县| 正阳县| 高淳县| 阿鲁科尔沁旗| 肇州县| 昌黎县| 老河口市| 刚察县| 钟祥市| 古田县| 古田县| 阿勒泰市| 玛沁县|