數據庫間數據表復制數據的辦法???(100分)

  • 主题发起人 主题发起人 stuwe
  • 开始时间 开始时间
S

stuwe

Unregistered / Unconfirmed
GUEST, unregistred user!
我使用的是Delphi+SQL Server 7.0
在兩台機器上同樣有SQL Server. 也有同樣結構的一個數據庫(指里面的數據表結構完全一樣)

問題:如何用Delphi編寫一個小程序將一台機器上的某一個數據表里面的數據復制到別一台機器上?
說明:(在數據表里面有一個字段是遞增的字段,兩邊的數據表都是有數據的,只是一台機器上的
數據會隨時更新,而另一台機器主要就是復制這些更新的數據過來,以達到兩個數據表數據相同的目的)
 
呵呵,最近正好在做这个。
算法是:
对于每张表的关键字进行查询根据关键字排序。
然后比较两个DataSet中的值。
比较的时候:
if DataSet1.FieldByName('a') = DataSet2.FieldByName('a') then
begin
bFindFlag := True;
break;
end;
else if DataSet.FieldByName('a') < DataSet2.FieldByName('a') then DataSet2.Next;
if not bFindFlag then 将数据插入数据库2
DataSet1.Next;
这些是临时写的。不全。只能写个大概。算法时间复杂性:2n。
基本上就这样,如果还有问题,我为公司贴一些具体代码给你。

 
我用ADO和數據庫連接,raymondcen能否給一段具體一點的代碼?
 
ok
等会儿我贴给你。
 
qry1.Close;
qry1.Open;
qry1.First;
qry2.Close;
qry2.Open;
qry2.First;
while not qry1.Eof do
begin
str := qry.FieldByName('a').AsString;
bFlagFind := False;
while not qry2.Eof do
begin
if str = qry2.FieldByName('a').AsString) then
begin
bFlagFind := True;
break;
end
else if str < qry2.FieldByName('a').AsString) then
break;
qry2.Next;
end;
if bFlagFind = False then
begin
qryInsert.Close;
qryInsert.SQL.Clear;
qryInsert.SQL.Add('insert into tablename(a) values(''' + str + ''')');
qryInsert.ExecSQL;
end;
qry1.Next;
end;
 
出錯啊
在兩個數據表里面有自動增1字段啊,出錯了
舉個例子吧:
像有DDB(autoID,name) {autoID是自動增1字段}
XXDDB(autoID,BH,MC,...) {autoID是自動增1字段}
XXDDB通過BH字段和DDB的AutoID字段關聯

在另一台機器上(是測試的機器){源數據是放在服務器上的,數據每天都有所改動,
多數是增加}
在測試的機器上有跟服務器上同樣的數據庫
目的是想從服務器上剛新增的數據復制到本地測試機上,以供測試用
復制完后數據庫間的連接也要正常
連接是方法:在ODBC中設置SQL Server數據源,通過ADOConnection連接
大概情況就是這樣的.謝謝!!
 
insert into tablea
select b.*
from tablea a,
(Select * from Openrowset('SQLOLEDB','layout08';'sa'; , 'select * from QDMIS.dbo.tablea') as tabtemp ) as b
where a.IDcolumn<>b.IDColumn
 
bes96261兄能不能說得具體一點?謝謝!
 
qry1的SQL:select autoID, name from DDB
(服务器的数据)
qry2的SQL:select autoID, name from DDB
(测试库的数据)

var id: Integer;
qry1.Close;
qry1.Open;
qry1.First;
qry2.Close;
qry2.Open;
qry2.First;
while not qry1.Eof do
begin
id := qry.FieldByName('autoID').AsInteger;
bFlagFind := False;
while not qry2.Eof do
begin
if id = qry2.FieldByName('autoID').AsInteger) then
begin
bFlagFind := True;
break;
end
else if id < qry2.FieldByName('autoID').AsInteger) then break;
qry2.Next;
end;
if bFlagFind = False then
begin
newid := 0;
while newid < id do
begin
//以下都是对测试库的操作
qryInsert.Close;
qryInsert.SQL.Clear;
qryInsert.SQL.Add('insert into DDB(name) values(''' + qry1.FieldByName('name').AsString + ''')');
qryInsert.ExecSQL;
qryGetMax.Close;
qryInsert.SQL.Clear;
qryInsert.SQL.Add('select MAX(autoID) as maxid from DDB');
qryInsert.Open;
newid := qryInsert.FieldByName('maxid').AsInteger;
if newid < id then
begin
qryDelete.Close;
qryDelete.SQL.Clear;
qryDelete.SQL.Add('delete from DDB where autoID = ' + newid);
qryDelete.ExecSQL;
end;
end;
end;
qry1.Next;
end;
这个小例子应该解决了你疑惑的问题。
这段代码解决了当服务器上添加的数据被删除又被添加的问题
当然还有服务器上将以前的代码删除的问题。不过大同小异。
剩下的你自己应该能搞定了吧!
 
raymondcen,我那個數據表不只一個字段啊
有10多個呀
 
那一樣能幫幫我啊!

思路也行!
 
如果你是通过BDE连接的话,试一试用BatchMove吧,两个不同数据库表之间的复制,同它最合适不过了。
 
問題是我只能用ADO啊!!
不可能用BDE
 
2个字段和多个字段没有本质的区别啊!
都按照关键字AutoID排序查询出来,只不过往测试数据库里插入的时候多插一点字段就行了啊!
思路就是我写给你的代码,那个是根据你所说的专门写的。
 
我還是搞不好!
有誰知道請給我發Eail
sheng@triumphford.com
先謝謝了!
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
810
import
I
D
回复
0
查看
1K
DelphiTeacher的专栏
D
后退
顶部