M$ SQL Server 远程数据库访问问题(108分)

  • 主题发起人 Randolph
  • 开始时间
R

Randolph

Unregistered / Unconfirmed
GUEST, unregistred user!
本人在编写一个数据库应用时需要:
将一台服务器的部分数据传输到另一个城市的服务器中,使用的数据库
是M$ SQL Server 6.5,大概有20个互相联系的表,一个是主表,其它的是
级联的从表,每发送主表的一个记录,必须保证对应在所有从表的记录都要
完整发送,而电话连接不稳定,经常发生断线,速度又慢,远程用户又不能
长时间占用表,因为还有其他用户访问数据库,所以不能采用TBatchMove来
实现,M$ SQL Server 6.5又不能实现

INSERT INTO ServerRemote.DatabaseName.Table
SELECT * FROM ServerLocal.DatabaseName.Table

的功能,我现在采用的是很笨的方法:把本地服务器和远程服务器的表都打
开,然后从头走到尾把本地服务器的记录Insert到远程服务器的表

for I := 0 to RecordCount - 1 do
begin
Database.StartTransaction;
try
SendOneMainRecordAndAllDetailRecords;
Database.Commit;
except
Database.Rollback;
raise;
end;
end;

但这显然很苯,而且在传输几百条记录时经常出现数据库被其他用户访问的
错误而终止,各位有什么好的解决办法吗?

还有,我用一个线程来执行上述功能,但中途终止线程却会“死机”,Why?
 
建议你用Socket写 Client/Server模式的程序,
客户端将数据按一定的格式组织起来,用Socket
发送过去,Server端根据数据生成SQL语句,插入/更新
数据库。

我们的程序就是这样做的,而且是一对多的,
(一Server多Client)。我们从不使用远程网
更新数据 -- 安全性与效率都成问题。

明天早上就要出差了,如果你感兴趣可以以后讨论 :)
 
我自然有兴趣啦,Socket方法我没用过,也不会用 :)
把实现方法介绍一下,看看是否可行。

不过,我的感觉这样无异于发送文件,根本未用到数据库提供的好处,
而且,可靠性是否成问题?
 
嘻嘻!我还没走(不过半个小时后就走了)

具体方法就是将要更新的数据按一定格式
拼接成字符串,然后发送给Server端.
Socket编程应该还是不难的,咱们这个论坛也没少讨论.

然后一切数据处理的逻辑全部在Server端实现,
似乎并没有损失什么数据库的先进功能.
只是相当于将于自己搞了一个小小的Multi-Tier结构.

这个办法的意图是减少DBMS本身给通讯带来的
额外开销.只要程序编得严格一点,可靠性应该没问题.
 
如果DBMS本身能够实现,那我肯定优先采用;
Winsock可能是不是办法的办法;
各位不妨介绍一下自己使用的方法,谢谢。
 
没有人愿意回答吗?
 
如果不愿意用这种方法,有两个建议,
1. 试一试Multi-Tier,从减少通讯量的角度也还可以,
但Transaction怎么做我还没来得及看;
2. 把那个StartTransaction挪到循环外面,
总会好一点,虽然可能由于通讯故障导致全部没有执行,
但总会减少通讯量,并且一致性更好。
 
为什莫不用msSQL的复制功能呢?
建立一个出版服务器(远程分发服务器)和
一个订阅服务器,其它完全不用自己抄心.
 
我并不是要求两台计算机数据同步,只是需要发送其中的部分数据到另一台服务器,
而且电话线不是任何时间都连着,只是需要转输数据是才连接,如何使用复制功能?

还有,我的问题最后一句所提的问题,也就是:
如何正常的终止一个正在执行数据库操作的线程?
没有人感兴趣吗?
 
你现在用什么办法终止线程而导致死机呢?
 
我使用的是Terminate方法,然后Free。但显然是不行。
后来我只好在Execute方法里面检测Terminated属性,
如果为True则返回,但不能马上终止。
 
各位大虾,多少说两句吧,如果两天以后还没有让我满意的答复,我就把分数分配给
各位回答者,这样等待简直是受罪。
 
忘记说了,我记得线程的终止本来就是这么会事,
你要自己写terminate过程,在里面将一切工作结束,
并置terminated=True;这时Execute中对terminated
判断就起作用了。

而对于你的数据库系统到底怎么编,显然没有一个一
句话的答案。
 
敬请版主注意:
这个问题既然没有让我满意的答复,我也不想再摆下去,决定收摊了。
我想如下分配分数:
按回答次数平均分给回答者,总共2人6人次,得分如下
var
pj,
dwwang,
chen: Integer; //陈荻秋
begin
pj := 108 div 6; //18
dwwang := pj * 5; //90
chen := pj * 1; //18
end;
 
顶部