通过Delphi应用程序在两台sql server服务器之间更新数据的问题(就200分吧,分少了还真的回答的人也少)(200分)

  • 主题发起人 主题发起人 千中元
  • 开始时间 开始时间

千中元

Unregistered / Unconfirmed
GUEST, unregistred user!
欢迎关税,关税2分。
问题如下:
服务器A:名称:powerNt,上面的注册sql server 也为 PowerNt,
PowerNt下有database:marketplace,里面有表:ShangPin
login:gree password: gree
服务器B:名称:software-1,上面的注册sql server也为 software-1,
software下有database:shopping,里面有表: ShangPin
login:blue,password: blue
现在要在后台数据库为服务器B的 Delphi应用程序“更新按钮事件”中,
将Shoftware-1下ShangPin表中标志字段:
1)值为'A'的记录添加到PowerNt下的ShangPin 表中,
2)标志位为'E'的记录更新PowerNt下的ShangPin表中相应的记录(ID不能修改),
3)标志位为'D'的记录删除PowerNt下的shangpin表中的相应记录
并且在该更新事件完成,
将服务器B(software-1)中标志位为'A','E'的改成'K',
删除标志位为'D'的记录。
我想是用‘Openrowser'写一个存储过程,可惜功力太浅的说:(






 
写存贮过程,去看看书啦。
现在有点忘了,等我去看书。
 
先把software-1上的表做成powerNT上的一个视图(可惜怎么做我也忘了,还得翻书)
然后再在powerNT上做个简单的存储过程就行了
 
找到了,还是bookonline好,翻书是坏习惯,以后要改了
create view ShangPin1 as
SELECT *
FROM OPENROWSET('MSDASQL',
'DRIVER={SQL Server};SERVER=software-1;UID=blue;PWD=blue',
shopping.dbo.shangping)
然后的存储过程相信千兄这样的高人一定没问题

 
人邀请灌水怎么反而人更少了?
 
>>然后的存储过程相信千兄这样的高人一定没问题
说你没问题,那就没问题了
 
只见老千赶紧从椅子上跳将下来,冲xiecc施礼道:
"大侠见笑了。还有很多地方请教。
第一:这个更新要求是商场端(software-1)的操作员控制
(因为商场的个数是N。。)而您这样写的视图是建立在
powerNt上的(我又理解错了?)
 
那就改在software-1建立视图
create view ShangPin1 as
SELECT *
FROM OPENROWSET('MSDASQL',
'DRIVER={SQL Server};SERVER=powerNT;UID=gree;PWD=gree',
marketplace.dbo.shangping)
不知道能不更新远程视图
insert into ShangPin1 select * from ShangPin where mark='A'我想应该没问题。

 
其实用程序的方法可能更好,如果嫌效率低的话可以采用适时更新
 
ado,程序怎么写?
 
应千兄邀请,先登记一下吧,暂时没时间细想,
一眼看上去觉得xiecc说的好像最有门儿,
我都不知道SQL-Srver有这个功能,回去试验一下。

但是你这种设计整体上讲不考虑并发问题吗?
 
我来关税!!!
顺便学习!!!
 
今天想了想,还是从根本上找原因吧:

software-x与powernt的shangppin表示什么关系?
software-x的shangpin表是一个log性质的表吧,不然怎么有标志字段呢?
如果是的话,为什么要实时更新,而不是一天结束后一次更新呢?
并且,你这里没有说有把powernt的数据再“反向”更新其他software-x,
那么实时更新好像确实没必要。

如果不是log表的话,那问题更复杂了,例如怎样避免
software-1,software-2同时更新该表而产生的冲突呢?

总之我觉得你产生这种需求是数据库或者程序设计不完全合理的原因,
建议你使用前面我说的第一种方式,做成log表,一次更新。

注:我上面说的这些只是考虑的结果,考虑过程中包括很多复杂技术问题,
不在这里一一说明了。
 
to 温柔一刀,
1)不考虑实时。
2)根据software-x的登陆名,“寻找”对应的表来更新,即要更新的表名其实是有个
前缀。。,因为这样太麻烦,我想先一步一步解决。
3)设计就是这样了,别人设计出来,俺写code,sigh,人家不管我死活,做不出来就是
失职。
to honestman,
有你的2分。
 
千兄:
你的问题是两个服务器,两个数据库,它们之间互相更改数据,是吗?
若是,用‘Openrowser'写一个存储过程的方法不行.
你应该在程序中写.按你说的1),2),3),放在一个事务中不行吗?
(我不太懂题意.)
另外:你知道如何用SQL在两个数据库中选数据吗?我贴一下吧(也许是多此一举).
SELECT X.*, department.dptNo
FROM ":XinZi:age" X, ":hr:departments" department

也许有帮助.
 
老千,
把问题写详细点,大家帮你出老千!
 
我知道两种方法可实现:
方法(一):
在窗体上创建两个TQUERY,qr1,qr2,其中,QR1连接服务器A,QR2连接服务器B。
procedure buttonclick(sender);
var
i:integer;
vvv:string;
With qr2 do
begin
close;
sql.text:=format('select * from shangpin where 标志位为=''%s''',['A']);
open;
for i:= 0 to recordcount-1 do
begin
vvv:=fieldbyname('字段名').asstring;
。。。。。

with qr1 do
begin
close;
sql.text:=FORMAT('insert into shangpin values(''%S'')',[VVV]);
execsql;
close;
end;
next;
end;
close;

其他的修改,删除同理。

end;

方法(二):
如果你用的是网络数据库,在SERVER上写PROCEDURE存储过程。
SQL SERVER7。0的PROCEDURE 如下:
在服务器A上建立:

Insert into powerNt.marketplace.dbo.shangpin
select * from software-1.shopping.dob.shangpin where 标志位为='A'

其他的修改,删除同理。
 
to ice.yang兄,
不知道两个服务器之间可以这样用。学一招,谢谢先。
如果删除(或者修改),需要按照software-1上被标志为‘D'的记录的Id号
来修改Powernt上的记录 (同时也是Powernt上对应记录的Id号),因为一般情况
下在software-1中修改了一批记录然后才更新Powernt上的,请问这样的存储过程
该怎么写?
BTW:已经按照query的把程序大致完成,只想着存储过程的效率高。
 
to 千中元:

对原问题看的不仔细,我以为考虑实时更新,如果没有的话,
确实没什么可说的了,不过是语句问题,大家说得差不多了。

btw:此问题结束时,请不要给我分数,好吗?
~~~~~~~~~~~~~~
^^^^
 
气死我了,凭什么说我的方法不行?我试了好好的
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
后退
顶部