主要控件:
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;
新聞熱點
疑難解答