程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> SqlServer數據庫 >> 關於SqlServer >> 引導線告訴你Oracle到SQL Server主鍵遷移辦法

引導線告訴你Oracle到SQL Server主鍵遷移辦法

編輯:關於SqlServer

這篇論壇文章主要介紹了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

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved