delphi com+ 三层灾难性故障(100分)

  • 主题发起人 主题发起人 lt2000
  • 开始时间 开始时间
L

lt2000

Unregistered / Unconfirmed
GUEST, unregistred user!
各位大侠,我们的一个COM+服务器老是过一段时间就报灾难性故障,查看自动生成的日志是在执行SQL时出错,错误日 志如下:
操作:执行SQL,异常: Select Top 20 T.* from
(
select a.*,b.f_RegistCode,b.f_Name from T_Inspection a
inner join T_Registration b on a.f_RegistID=b.f_id
Where a.f_state =2 and a.f_PerformDepart='1301' and (a.f_ProposeDate between '2008-1-16' and '2008-1-17')
) As T
Order by T.f_ID

参数:Access violation at address 4DB11739 in module 'MIDAS.DLL'. Write of address 02B24000
时间:2008-1-16 10:18:33
 
'MIDAS.DLL'是delphi为三层开发提供连接接口的,一定要注册一下试试
 
注册了,要不服务程序运行不起来的,我是怀疑是不是SQL语句的原因
 
你用sql的查询分析器分析看看有毛病没
 
没有呀,代码如下:
function TMainServer.ExecuteSQL(const SQL:WideString;
out Err:WideString):WideString;
function CheckHasData:boolean;
const
cSelect = 'SELECT';
var
UpSQL:string;
iSel:Integer;
begin
UpSQL := UpperCase(Trim(SQL));
iSel := Pos(cSelect, UpSQL);
Result := (iSel > 0) and (iSel < length(cSelect));
end;
{
var
ADOQuery:TADOQuery;
DataSetProvider:TDataSetProvider;
ClientDataSet:TClientDataSet;}
begin
Result := '';
ADOQuery1.Close;
try
try
ADOQuery1.SQL.Text := SQL;
if CheckHasData then
begin
ClientDataSet2.Open;
Result := IdEncoderMIME1.EncodeString(ClientDataSet2.XMLData);
end else
ADOQuery1.ExecSQL;
SetComplete;
except
on E:Exceptiondo
begin
AddLog('执行SQL', E.Message, SQL);
Err := E.Message;
SetAbort;
end;
end;
finally
ADOQuery1.Close;
ClientDataSet2.Close;
end;
end;
 
程序结构问题.
var
ADOQuery:TADOQuery;
DataSetProvider:TDataSetProvider;
ClientDataSet:TClientDataSet;}
上面这段要放在中层间初始化代码中执行.如果你直接放在了方法中,那么程序的效率不高,并且也不是很安全,很容易出错.
 
“COM+灾难性故障”基本上都是由使用没有实例化的对象造成的,检查一下你的代码。
 
查出来了,是ClinetDataSet在取BLOB数据时产生访问错误,那个变量定义是修改过后忘记删除的代码
 
var
ADOQuery:TADOQuery;
DataSetProvider:TDataSetProvider;
ClientDataSet:TClientDataSet;}
begin
Result := '';
ADOQuery1:=TADOQuery.create(nil);//要创建adoquery对像
.....
使用完后
adoquery1.free;
 
三层灾难性故障
主要的原因是的调用的中有对像没有初始化
 
后退
顶部