我的一个服务器端程序,用到OleVariant传数据给客户端,10天内可能会有一次报错且是致命的,
错误内容是‘Read of address 00000001’,一出这个错误,服务器就崩了,其他凡有OleVariant操作的地方,一执行就会报错
经追踪,发现是给OleVarian变量赋值或执行VarClear时出错
有谁知道为什么会这样呀,帮帮忙呀
错误内容是‘Read of address 00000001’,一出这个错误,服务器就崩了,其他凡有OleVariant操作的地方,一执行就会报错
经追踪,发现是给OleVarian变量赋值或执行VarClear时出错
有谁知道为什么会这样呀,帮帮忙呀
去掉VarClear试试
应该没有,这时你调用其他函数没带OleVariant变量的又没有问题
VarClear老出错,但我去掉了,不在这出错了,而又在给OleVariant变量值的地方出错
var
Dsp: TDatasetProvider;
begin
try
Dsp := TDatasetProvider.Create(nil);
try
Dsp.Constraints := false;
Dsp.Exported := false;
Dsp.DataSet := DataSet;
//Dsp.ResolveToDataSet := false;
Result := Dsp.Data;
finally
Dsp.Free;
end;
except
end;
end;function TWcldDm.ReadClawv(var CORP_ID: String; var OleData: TeOleType): String;
begin
try
//VarClear(OleData); //如果不注释,这里会偶尔出错,跟描述的情况一样
except
on e: exception do
PubFile.FileWriteLog(ExtractFilePath(ParamStr(0)) + 'eLog\eServerErrLog.Log',
'DataSetToOle: ' + e.Message, 2500);
end;
//从数据库中读取出数据
Result := TPubSQL.Open(SQLQuery1, 'SELECT CORP_ID, CLD_ID, LAWV_V, ' +
'LAWV_NOTE, LAWV_TS FROM PZ_CLAWV WHERE CORP_ID = ' + QuotedStr(Corp_ID));
if trim(Result) <> '' then exit;
//数据以OleData形式返回客户端
OleData := TPubDbServer.DataSetToOle(SQLQuery1);
SQLQuery1.Close;
end;
就是给OleData赋值时出错
要是能重现,我可能自己也能搞定了,自己测试一千遍也不会报错,一到客户哪运行一段时间就出错了,最头疼就是这种不知何时何地何原因冒出的东西(明明看着代码是没问题的),很郁闷的
有的时候我也怀疑是Delphi自身的bug
TeOleType是个什么类型?
每次新建一个?? 还是一个全局变量?很多可能,或许第一个,你先检查下内存的情况,看内存会不会逐步增长,内存泄露?再检查,是不是共享冲突的问题>>‘Read of address 00000001’
好像是还没初始化,或者溢出了
呵呵, 我的只有一个服务器程序
内存无泄露,我用内存工具检测是过
我的服务器端是采用线程缓冲池方式,一次测试十几二十个连接也没问题,更多的也没问题,并不是次次都是这样,而是有可能服务器运行一个月才有这种错误情况,要是内存有泄露一天可能就崩了,因为客户那有十几个客户端天天在用的
TeOleType = OleVariant;BlueTrees(蜗牛) : 如果是你所说的情况,我以上的函数应如何改呢? 我试过,直接给OleVariant赋Null值有时也会也错的
不知道是否是同样的情况,你试下用 同步机制 来限制这段写的代码因为我们一般用单cpu,冲突的机会极小,但还是有可能,
试下看是不是我说的原因
var
Dsp: TDatasetProvider;
begin
try
Dsp := TDatasetProvider.Create(nil);
try
Dsp.Constraints := false;
Dsp.Exported := false;
Dsp.DataSet := DataSet;
//Dsp.ResolveToDataSet := false;
Result := Dsp.Data;
finally
Dsp.Free;
end;
except
end;
end;
function TWcldDm.ReadClawv(var CORP_ID: String; var OleData: TeOleType): String;
begin
try
.....
except
on e: exception do
PubFile.FileWriteLog(ExtractFilePath(ParamStr(0)) + 'eLog\eServerErrLog.Log',
'DataSetToOle: ' + e.Message, 2500);
//在Except这段代码里,是没有用try保护住的...不清楚你的FileWriteLog里线程保护了吗?
end;
但是经验告诉我:WIndows自己也不是非常的稳定可靠的
OleData := TPubDbServer.DataSetToOle(SQLQuery1);//这句的,这句我用try...except end;
捕捉过,问题的关键不是出现在TPubDbServer.DataSetToOle(SQLQuery1)里面,而是给OleVariant变量赋值时或执行VarClear时会出错
OleData := TPubDbServer.DataSetToOle(SQLQuery1);//这句的,这句我用try...except end;
捕捉过,问题的关键不是出现在TPubDbServer.DataSetToOle(SQLQuery1)里面,而是给OleVariant变量赋值时或执行VarClear时会出错//////////////////////////////////////////////////
换一下声明试试:function PubDbServer.DataSetToOle(DataSet: TDataSet,out Data:OleVariant): boolean;
CarClear执行清理的时候清理过程比较复杂,很难知道是哪一个地方出了问题。
是不是你的Dsp 返回值有异常的时候。碰巧每隔10天左右就有的用户遇到了。
或者你这样试一下
Dsp:= TDatasetProvider.Create(self);
或直接把DSP放到远程数据模块上,然后再使用,不要手动创建了!
其实程序写法应该没问题,其他不带OleVariant变量返回值从没出现过这个错误,只要一出现这个错误,再调用到带OleVariant变量的函就全都会出错
var OutData: olevariant;var Msg:widestring): boolean;
begin
Result:=False;
try
adoDataSet.Close;
adoDataSet.CommandText:=strSQL;
adoDataSet.Open;
OutData:=DSPRead.Data;
adoDataSet.Close;
Result:=True;
except
On E:Exception do Msg:=E.Message;
end;
end;
这是我的,我用了两年多了,系统上线运行到现在,没有遇到你说的那种情况!
还有一点是,我的是dll中,你的是不是呢
?
lwk_hlj(阿凯(学习.net中)) , 我用的dbexpress 中的SQLQuery读取数据,不是你用Ado啦
还有一点是,我的是dll中,你的是不是呢
我用dbexpress也是如上处理,也没有问题,但是,我不会做到dll中的,因为三层服务器放用dll如果做不好,就会出很多问题的,处理起来实在太麻烦了,你可以试一下带包编译一下试试!
vcl,rtl,vclx在project options 的packages页面上
你所说的带什么包,如何编译,是我的DLL带包编译吗