使用Dcom编写应用服务器,总是报出“对象被打开”的错误?!?(150分)

  • 主题发起人 主题发起人 zhbforce
  • 开始时间 开始时间
Z

zhbforce

Unregistered / Unconfirmed
GUEST, unregistred user!
开发环境:Delphi6+Windows2000 Oracle 8.1.7
使用TSocketConnection,ADO
我开发了一个应用服务器程序,在应用服务器端定义了很多检索和更新数据库的函数,例如:
procedure TmAppJS973.UploadDataJbxx(const sXmbm: WideString;
var fData: OleVariant;
var iResult: Integer);
safecall;
begin
MainForm.changeUpdate;
if VarIsArray(fData) then
begin
sSql:='select * from xmxx where mxmbh='''+sXmbm+'''';
rs.Close;
rs.CommandText:=sSql;
rs.Open;
if rs.Eof then
begin
iResult:=0;
Exit;
end;

try
sSql:='UPDATE xmxx SET hzbz='''+fData[0]+''',phbz='''+fData[1]+''',f_xmbzr='''+
fData[2]+''',f_xmzxr='''+fData[3]+''',f_xmfzr='''+fData[4]+''',f_bsrq='''+fData[5]+
''' where mxmbh='''+sXmbm+'''';
cm.CommandText:=sSql;
cm.Execute;
iResult:=1;
except
on e:Exceptiondo
begin
iResult:=0;
ShowMessage('UploadDataJbxx catch an error.'+e.Message+sXmbm);
end;
end;
end
else
iResult:=0;
end;
//--------------------------------------------------------------------------------------------------------
procedure TmAppJS973.ReceiveDataJbxx(const sXmbm: WideString;
var fData: OleVariant;
var iResult: Integer);
safecall;
var
v:OleVariant;
begin
MainForm.changeRequest;
try
sSql:='select * from xmxx where mxmbh='''+sXmbm+'''';
rs.Close;
rs.CommandText:=sSql;
rs.Open;
if rs.Eof then
begin
iResult:=0;
Exit;
end;

v:=VarArrayCreate([0,5], varVariant);
v[0]:=rs.FieldByName('hzbz').AsString;
v[1]:=rs.FieldByName('phbz').AsString;
v[2]:=rs.FieldByName('f_xmbzr').AsString;
v[3]:=rs.FieldByName('f_xmzxr').AsString;
v[4]:=rs.FieldByName('f_xmfzr').AsString;
v[5]:=rs.FieldByName('f_bsrq').AsString;
fData:=v;
iResult:=1;
except
on e:Exceptiondo
begin
iResult:=0;
ShowMessage('ReceiveDataJbxx catch an error.'+e.Message+sXmbm);
end;
end;
end;
//------------------------------------------------------------------
实际运行期间不时的跳出“对象被打开”的错误信息,但是不会影响应用服务器的运行,我想
知道这是为什么? 是数据访问冲突?
 
非常奇怪,单个客户端运行,检索数据时不会报出任何错误,但是大于一个客户端同时访问
并且快速检索数据时,错误就报个不停,错误信息是“对象被打开”,难道是Oracle的错误?
 
rs用动态生成,每个函数用单独的rs
 
你的服务器对象,是独立线程还是混合线程
 
使用Apartment类型的。
 
换成Single的会有帮助吗?
怎样换成其他的线程模型。
 
对象被打开是中间层和客户端不一致造成的!
 
中间层和客户端应该是完全一致的,最上方有函数的源码,使用Apartment模型,单个用户使用时没有问题,多用户访问时,问题不断。
 
邮件已发出,将多线程改为单线程即可
 
zhbforce:
你好,我现在遇到与你http://www.delphibbs.com/delphibbs/dispq.asp?lid=1586628
上述相同的问题,不知你最后是如何解决的,请麻烦告知,谢谢,我很着急。如要分,请说明,我会开贴给分决不失言。谢谢!!!
 
Recordset用动态生成,每个函数用单独的Recordset和Tadocommand,就可以避免这个问题。
 
再请问
1、是不是与Apartment模型无关?
2、如何动态生成Recordset?请问你所说的要动态生成的Recordset是客户端的clientdateset还是服务器端的adoQuery?
能否给出代码,万分感谢!!!
我的邮箱sunwlsun@163.com
 
后退
顶部