由于才接触MIDAS多层体系的编码,有几个问题一直困扰着我,请各位帮忙解答解答(100分)

H

hxning

Unregistered / Unconfirmed
GUEST, unregistred user!
1. 怎样防止多个用户同时对同一个表的数据进行修改,如果加锁的话,应该怎么加?
2. 当一个用户修改并保存了数据后,怎样可以让其他用户即时自动刷新,是通过消息机制吗?
3. sybase支持ado访问吗,我在使用ado的时候,好像有些问题,比如获取字符字段数据的时候
在字符串后面有许多空格,不知道怎么解决
请尽量提供代码作为参考
 
到底有没有高手可以告诉我这些问题应该怎么解决呀,难道没有高手吗?wuwuwuwu~~
能答一个也好啊
 
1.因为我全部是用SQL语句来插入值和修改以及删除,在修改时,比较修改前的值和数据库中
当前这条记录的值,如果不一样,则表示有人修改过,则这条记录不能提交.
2.最好就是加一个刷新的功能.
3.没有用过SYBASE
 
1.其实Midas内在支持的,但是很多人都不知道其内部运作规则,都喜欢自己写
2。由客户自己刷新,当然你可以用自动化事件,由服务段调用客户端,但比较难,
我没实践过。
 
刷新的话,可以通过回调接口来实现的,通过回调接口通知客户端刷新。
 
加琐:select * from table where .... for update
当一个用户修改并保存了数据后,怎样可以让其他用户即时自动刷新,是通过消息机制吗?
不需要消息,可用这个方法:当对数据库中一条已修改了的记录进行操作是,数据库会
扑捉到一个错误。我就扑捉这个错误,然后再处理刷新
 
你所有修改都是通过中间层修改的,就能知道对哪个表修改的。
再加个回调接口,通知客户端就可以了。
 
to yeath: 这种情况用回调,会不会有问题?
当一个用户调用应用层函数时,把应用层的指针变量(也就是记录当前客户端调用的那个接口)
赋给应用层的一个变量,接着又去执行要调用的函数;这时又有一个用户调用应用层函数时,
会把前面的变量替换了,当应用层回调到客户端时可能不是前面那个了
当然你可以定义一个数组来记录所有来访的客户端, 以便出现乱套,这样呢回调指针在组件
被删除之前都是处于有效状态。应该使用一种标准的方法与引出接口断开连接(不知道用什么方法)
procedure VariantToStream(const Data: OleVariant;
Stream: TStream);
var
p: Pointer;
begin
p := VarArrayLock(Data);
try
Stream.Write(p^, VarArrayHighBound(Data,1) + 1);
finally
VarArrayUnlock(Data);
end;
end;
我不知道 VarArrayLock() 是不是加锁的意思,因为我以前一直都这样认为,但看了李维书
中说它是为了执行速度快。
sybase支持ado的,你可以看看《Delphi 5.X ADO_MTS_COM+高级程序设计篇》
 
不会的,当有多个客户连上来的时候,服务器会启不同的进程(tmApartment)模式,所以你不
用担心覆盖这个问题,看看下面的代码(回调接口):
unit Unit2;
{$WARN SYMBOL_PLATFORM OFF}
interface
uses
Windows, Messages, SysUtils, Classes, ComServ, ComObj, VCLCom, DataBkr,
DBClient, Project1_TLB, StdVcl, Provider, DB, DBTables, ADODB,Variants,dialogs;
type
TEasyDcomServer = class(TRemoteDataModule, IEasyDcomServer)
DSP_A: TDataSetProvider;
private
CallBackTemp:OleVariant;
{ Private declarations }
protected
class procedure UpdateRegistry(Register: Boolean;
const ClassID, ProgID: string);
override;
procedure Connect(vClient: OleVariant);
safecall;
published
procedure SendMessage(const sMsg: WideString);
safecall;
{ Public declarations }
end;

implementation
uses Unit1, ComCtrls;
{$R *.DFM}
class procedure TEasyDcomServer.UpdateRegistry(Register: Boolean;
const ClassID, ProgID: string);
begin
if Register then
begin
inherited UpdateRegistry(Register, ClassID, ProgID);
EnableSocketTransport(ClassID);
EnableWebTransport(ClassID);
end else
begin
DisableSocketTransport(ClassID);
DisableWebTransport(ClassID);
inherited UpdateRegistry(Register, ClassID, ProgID);
end;
end;

procedure TEasyDcomServer.Connect(vClient: OleVariant);
begin
Form1.Label2.Caption := 'Client connected';
Form1.mdata := self;
//中间层的主窗体,mData用于保存RDM
CallBackTemp := vClient;
//用于客户端传递过来的回调接口
end;

procedure TEasyDcomServer.SendMessage(const sMsg: WideString);
begin
CallBackTemp.OnText(sMsg);
//通过回调接口调用OnText向客户端发消息
end;

initialization
TComponentFactory.Create(ComServer, TEasyDcomServer,
Class_EasyDcomServer, ciMultiInstance,TThreadingModel(tmBoth));
// TComponentFactory.Create(ComServer, Tiapp,
// Class_iapp, ciMultiInstance, tmBoth);
end.
中间层主窗体通过
mData.SendMessage(edit1.text);向客户端发消息,当有多个客户连上来的时候
你只要把mData改为数组,并对mData进行维护,(保存RDM的引用)
 
1. 怎样防止多个用户同时对同一个表的数据进行修改,如果加锁的话,应该怎么加?
答:一般SQL会自动进行,是一个透明的操作,如果业务有要求防止多个用户
同时对同一个表的数据进行修改,可采用两个方案进行,一个是:运用SQL中的
事物进行加锁,另一个是自编加锁控制!
2. 当一个用户修改并保存了数据后,怎样可以让其他用户即时自动刷新,是通过消息机制吗?
答:这个问题的解决方案可以采用DCOM的信息来控制进行。也可采用定时跟踪刷新表的方式
进行,这样太耗时。
 
SQL加锁不会自动进行。当您取完数据后,另一个用户又来更新数据。这里,您必须加锁。
您可以这样加锁,方法很多哟:
Select for update
 
谢谢各位啦,对小弟启发颇大,受益非浅啊,好,结账啦
 

Similar threads

S
回复
0
查看
987
SUNSTONE的Delphi笔记
S
S
回复
0
查看
805
SUNSTONE的Delphi笔记
S
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
1K
SUNSTONE的Delphi笔记
S
顶部