给大家一段程序大家看看。 //17**************************************************************************** //根据水表号检索当前水表计费信息 //参数:SBH水表编号 //返回参数:返回查找的记录数 //****************************************************************************** function TGSRD.Get_sbjfxx(const SBH: WideString; var re: WideString): Integer; begin with DataModule1 do begin try ads_sfwsfdj.Close; ads_sfwsfdj.CommandText:=''; ads_sfwsfdj.CommandText:='select * from meter where watergage_code=:sbh '; ads_sfwsfdj.Parameters.ParamByName('sbh').Value:=sbh; ads_sfwsfdj.Open; result:=ads_sfwsfdj.RecordCount; re:='^1^'; except on E: Exception do begin frm_main.add_ERRmessage(' 方法调用失败.方法名称:Get_sbjfxx; 错误内容: '+e.Message); re:= '方法调用失败.方法名称:Get_sbjfxx; 错误内容: '+e.Message; exit; end; end; frm_main.add_message(' 方法调用成功. 方法名称:Get_sbjfxx, '+' 根据水表号检索当前水表计费信息调用成功!'); end; end; 请看看多人使用时候会有问题吗????
现将错误信息公布如下: 1\ operation cannot be performed while execnting asyncharononsly. 2\ 2004-8-26 12:17:10: 方法调用失败.方法名称:Get_khJTSBxx; 错误内容: Connection is busy with results for another command
procedure Tfrm_main.add_message(msg:string); begin // errmemo_message.Lines.Add(datetimetostr(now())+': '+msg); end; procedure Tfrm_main.add_ERRmessage(msg:string); begin errmemo_message.Lines.Add(datetimetostr(now())+': '+msg); end;注释: errmemo_message:Tmemo end;
最新错误信息公布如下: 1\ item cannot be found in the collection corresponding to the requesed name or ordinal 2\ cannot peform this operation on an open dataset.
应该就是在 procedure Tfrm_main.add_ERRmessage(msg:string); begin errmemo_message.Lines.Add(datetimetostr(now())+': '+msg); end; 这里死掉了,多项程不要直接调用涉及GUI控件的方法,即使你用临界保护也没用,何况你这里连保护都没有建议用消息或者同步方法来实现
to : alphax(多喝了三五杯) ( ) 那一段我已经删除了,(add_ERRmessage(msg:string);) 然后出现:2\ cannot peform this operation on an open dataset. 我想是:多用户调用中间层时候,互相影响了,如何做到互相不影响。为每个客户端单独创建一个Apartment。 谢谢
你写过三层程序吗???
如有哪位高手能指点一点,本人很是感谢
//17****************************************************************************
//根据水表号检索当前水表计费信息
//参数:SBH水表编号
//返回参数:返回查找的记录数
//******************************************************************************
function TGSRD.Get_sbjfxx(const SBH: WideString;
var re: WideString): Integer;
begin
with DataModule1 do
begin
try
ads_sfwsfdj.Close;
ads_sfwsfdj.CommandText:='';
ads_sfwsfdj.CommandText:='select * from meter where watergage_code=:sbh ';
ads_sfwsfdj.Parameters.ParamByName('sbh').Value:=sbh;
ads_sfwsfdj.Open;
result:=ads_sfwsfdj.RecordCount;
re:='^1^';
except
on E: Exception do
begin
frm_main.add_ERRmessage(' 方法调用失败.方法名称:Get_sbjfxx; 错误内容: '+e.Message);
re:= '方法调用失败.方法名称:Get_sbjfxx; 错误内容: '+e.Message;
exit;
end;
end;
frm_main.add_message(' 方法调用成功. 方法名称:Get_sbjfxx, '+' 根据水表号检索当前水表计费信息调用成功!');
end;
end;
请看看多人使用时候会有问题吗????
1\ operation cannot be performed while execnting asyncharononsly.
2\ 2004-8-26 12:17:10: 方法调用失败.方法名称:Get_khJTSBxx; 错误内容: Connection is busy with results for another command
这个错误信息很常见的。
两点改动意见:
1, 最好改这句改成记日志文件。。
frm_main.add_ERRmessage(' 方法调用失败.方法名称:Get_sbjfxx; 错误内容: '+e.Message);
2, 抓住异常后要AdoConnection.close;
frm_main.add_ERRmessage(' 方法调用失败.方法名称:Get_sbjfxx; 错误内容: '+e.Message);
已经改动了。
问: halfdream(哈欠) ( ) “ 抓住异常后要AdoConnection.close;”
为何要这样做,AdoConnection.close后,需要OPEN吗??;
begin
// errmemo_message.Lines.Add(datetimetostr(now())+': '+msg);
end;
procedure Tfrm_main.add_ERRmessage(msg:string);
begin
errmemo_message.Lines.Add(datetimetostr(now())+': '+msg);
end;注释:
errmemo_message:Tmemo
end;
1\ item cannot be found in the collection corresponding to the requesed name or ordinal
2\ cannot peform this operation on an open dataset.
Class_GSRD, ciMultiInstance, tmApartment);
procedure Tfrm_main.add_ERRmessage(msg:string);
begin
errmemo_message.Lines.Add(datetimetostr(now())+': '+msg);
end;
这里死掉了,多项程不要直接调用涉及GUI控件的方法,即使你用临界保护也没用,何况你这里连保护都没有建议用消息或者同步方法来实现
那一段我已经删除了,(add_ERRmessage(msg:string);)
然后出现:2\ cannot peform this operation on an open dataset.
我想是:多用户调用中间层时候,互相影响了,如何做到互相不影响。为每个客户端单独创建一个Apartment。
谢谢
中间层的数据集都是CLOSE的。通过程序OPEN 。如果两人同时调用方法OPEN。就会出现如上错误。另:如何使用中间层 session .好象是 BDE的产物。我用的是AOD。李微的书也提到。
to alphax(多喝了三五杯) ( ) :
"DataModule1是每个客户对象各自一个还是共享?
我该如何看DataModule1是每个客户对象各自一个还是共享,我不会看。
就是当你每创建一个COM对象时,是否同时创建了一个属于该COM对象私用的DataModule1,不过从你的使用的标识符的命名上看来,你很可能是多个对象实例操作同一个DataModule1对象,幸好还是ADODataSet对象,要是别的TDataSet对象,你哪能看到这么友好的错误信息,中间层不崩溃给你看才怪呢如果你想多个COM对象同时存取一个全局的dataModule对象,那就必须同步好,要做好临界保护,还要求每个调用都是没有上下文的调用,,,如果你是初学的,最好是每创建一个COM对象就创建一个DataModule对象
我知道我错在那里了,也明白了“共享”和“单独”的DataModule1的问题了。谢谢,
你是真正的多层高手。希望将来能多多赐教。com/dcom的多线程的,如果中间加入了单个窗口上的方法操作,肯定会出问题。整个的服务器都应是多线程的。