公司同仁写的,好久不玩DELPHI了,觉得有问题,但又说不出。
不是说程序不能执行,但是内存、效率、维护方面,总感觉有些问题,请大家帮忙看看
// update MNIDOnline
// flag
//首先判断当前mnid是否存在
//如果存在则update
//如果不存在则Add
function TDMSimulation.UpdateCurrentMNIDOnline(var mnid : TMNID; flag : integer) : boolean;
var qryTemp : TQuery;
begin
//
try
OpenDataBase;
qryTemp := TQuery.Create(Self);
qryTemp.DatabaseName := Self.SQCDB.DatabaseName;
qryTemp.SQL.Clear;
qryTemp.SQL.Text := Format('SELECT MNID from TBLMNID WHERE UPPER(MNID)=''%S'''
, [UpperCase(mnid.MNID)]);
qryTemp.Open;
if not qryTemp.IsEmpty then //update
begin
qryTemp.SQL.Clear ;
qryTemp.SQL.Text := Format('update tblmnid set mocode = ''%S'',RouteID=''%S'''
+',CurrRoute= ''%S'',CurrSegment = ''%S'',CurrStepSeq = ''%S'''
+',CurrOP= ''%S'',CurrRes=''%S'',NextRoute=''%S'''
+',NextOP=''%S'' where MNID=''%S'''
,[mnid.MOCode,mnid.RouteID,mnid.CurrentRouteID
,mnid.CurrentSegmentID,mnid.CurrentStepSequenceID
,mnid.CurrentOpeartionID,mnid.CurrentResourceID
,mnid.NextRouteID,mnid.NextOpeartionID,mnid.MNID]);
qryTemp.ExecSQL;
qryTemp.Close;
end
else
begin
qryTemp.SQL.Clear;
qryTemp.SQL.Text := Format('insert into tblmnid values(''%S'',''%S'',''%S'''
+',''%S'',''%S'',''%S'''
+',''%S'',''%S'',''%S'''
+',''%S'' )'
,[mnid.MNID,mnid.MOCode,mnid.RouteID,mnid.CurrentRouteID
,mnid.CurrentSegmentID,mnid.CurrentStepSequenceID
,mnid.CurrentOpeartionID,mnid.CurrentResourceID
,mnid.NextRouteID,mnid.NextOpeartionID]);
qryTemp.ExecSQL;
qryTemp.Close;
end;
except on E:Exception do
begin
raise Exception.Create('44002' );
end; end; end;
不是说程序不能执行,但是内存、效率、维护方面,总感觉有些问题,请大家帮忙看看
// update MNIDOnline
// flag
//首先判断当前mnid是否存在
//如果存在则update
//如果不存在则Add
function TDMSimulation.UpdateCurrentMNIDOnline(var mnid : TMNID; flag : integer) : boolean;
var qryTemp : TQuery;
begin
//
try
OpenDataBase;
qryTemp := TQuery.Create(Self);
qryTemp.DatabaseName := Self.SQCDB.DatabaseName;
qryTemp.SQL.Clear;
qryTemp.SQL.Text := Format('SELECT MNID from TBLMNID WHERE UPPER(MNID)=''%S'''
, [UpperCase(mnid.MNID)]);
qryTemp.Open;
if not qryTemp.IsEmpty then //update
begin
qryTemp.SQL.Clear ;
qryTemp.SQL.Text := Format('update tblmnid set mocode = ''%S'',RouteID=''%S'''
+',CurrRoute= ''%S'',CurrSegment = ''%S'',CurrStepSeq = ''%S'''
+',CurrOP= ''%S'',CurrRes=''%S'',NextRoute=''%S'''
+',NextOP=''%S'' where MNID=''%S'''
,[mnid.MOCode,mnid.RouteID,mnid.CurrentRouteID
,mnid.CurrentSegmentID,mnid.CurrentStepSequenceID
,mnid.CurrentOpeartionID,mnid.CurrentResourceID
,mnid.NextRouteID,mnid.NextOpeartionID,mnid.MNID]);
qryTemp.ExecSQL;
qryTemp.Close;
end
else
begin
qryTemp.SQL.Clear;
qryTemp.SQL.Text := Format('insert into tblmnid values(''%S'',''%S'',''%S'''
+',''%S'',''%S'',''%S'''
+',''%S'',''%S'',''%S'''
+',''%S'' )'
,[mnid.MNID,mnid.MOCode,mnid.RouteID,mnid.CurrentRouteID
,mnid.CurrentSegmentID,mnid.CurrentStepSequenceID
,mnid.CurrentOpeartionID,mnid.CurrentResourceID
,mnid.NextRouteID,mnid.NextOpeartionID]);
qryTemp.ExecSQL;
qryTemp.Close;
end;
except on E:Exception do
begin
raise Exception.Create('44002' );
end; end; end;
解决方案 »
- Tpaintbox控件的Refresh等三个方法特点、区别?
- (100分求答案!)在WINDOWS(98、2000等)下如何获取打印机支持的所有纸张类型?望提供源码
- 读取vc编写的com返回的oleVariant类型的数据
- 遍历MainMenu的问题
- 请问那位有reportmachine2.4后的版本,能不能发一个给我
- 请问TNMUDP的SendStream方法可以发送多大的流?
- 如何在sql中对两日期字段进行相减,并返回总的小时数
- Delphi内存释放问题。
- 讨论:C/S与B/S的优缺点?
- 必定会执行的代码
- 不能把字段更新为空值,这是ClientDataSet的bug吗?
- 求条件组合查询代码!
直接批吧,我是懒的去一个个挑了qryTemp := TQuery.Create(Self);
没有保证出现异常时,释放qryTemp
SELECT MNID from TBLMNID WHERE UPPER(MNID)=''%S'''时,如果没有查到记录,那么qryTemp 没有Close......
大家帮忙看看吧,我懒的批这种代码了
这种代码要跑到生产线上去,恐怕要死人呀!
什么时候这个内存才会被释放??
就当玩玩代码吧
var qryTemp : TQuery;
begin
//
try
OpenDataBase;
qryTemp := TQuery.Create(Self);
qryTemp.DatabaseName := Self.SQCDB.DatabaseName;
qryTemp.SQL.Clear;
qryTemp.SQL.Text := Format('SELECT MNID from TBLMNID WHERE UPPER(MNID)=''%S'''
, [UpperCase(mnid.MNID)]);
qryTemp.Open;
if not qryTemp.IsEmpty then //update
begin
qryTemp.SQL.Clear ;
qryTemp.SQL.Text := Format('update tblmnid set mocode = ''%S'',RouteID=''%S'''
+',CurrRoute= ''%S'',CurrSegment = ''%S'',CurrStepSeq = ''%S'''
+',CurrOP= ''%S'',CurrRes=''%S'',NextRoute=''%S'''
+',NextOP=''%S'' where MNID=''%S'''
,[mnid.MOCode,mnid.RouteID,mnid.CurrentRouteID
,mnid.CurrentSegmentID,mnid.CurrentStepSequenceID
,mnid.CurrentOpeartionID,mnid.CurrentResourceID
,mnid.NextRouteID,mnid.NextOpeartionID,mnid.MNID]);
qryTemp.ExecSQL;
qryTemp.Close;
end
else
begin
qryTemp.SQL.Clear;
qryTemp.SQL.Text := Format('insert into tblmnid values(''%S'',''%S'',''%S'''
+',''%S'',''%S'',''%S'''
+',''%S'',''%S'',''%S'''
+',''%S'' )'
,[mnid.MNID,mnid.MOCode,mnid.RouteID,mnid.CurrentRouteID
,mnid.CurrentSegmentID,mnid.CurrentStepSequenceID
,mnid.CurrentOpeartionID,mnid.CurrentResourceID
,mnid.NextRouteID,mnid.NextOpeartionID]);
qryTemp.ExecSQL;
qryTemp.Close;
end;
except on E:Exception do
begin
raise Exception.Create('44002' );
end; end;
qryTemp.free;//应该在这里释放,不然只有等到form free的时候
end;
当前过程或函数结束后自动就释放,delphi会自动释放,
表面上看没有什么问题,不过既然是函数 为什么没有返回值啊?就是result:=true 或者;
result:=false;
应该有这样的语句才是完整的函数function 啊!
不过一般使用clear 过程前得先close query的
qryTemp.Open; ***
if not qryTemp.IsEmpty then //update
begin
qryTemp.close; ////////////////////////
qryTemp.SQL.Clear ;***
qryTemp.SQL.Text := Format............
...........
else
begin
qryTemp.close; ///////////////////////
qryTemp.SQL.Clear;***
qryTemp.SQL.Text := Format('insert ...........
qryTemp := TQuery.Create(Self);
create Self 的东西,你自己去释放合理吗?
什么时候又跑这溜达啦
苦闷呀,给这帮家伙提点意见,居然对我有意见了,我们有意见就在这里提,发点牢骚而已
DEIPHI多好呀,给这帮家伙这么折腾,到时一定要骂DELPHI,说DELPHI内存机制不好用
create Self 的东西,你自己去释放合理吗?当然合理,自己创建临时的对象,用完应该立即释放,不要占着毛坑布拉斯
Create(self)和Create(nil) 无关紧要
如果是Create(Self)
我觉得不需要自己去释放,因为,当Self被释放的时候他会去释放,如果你已经释放了,那么就会出错。
当然,有的Self释放前会去检查,但你这么写就依赖于某个Self了。最后从程序逻辑上说:临时的对象为什么要委托给Self去释放?所以,我觉得你如果手动释放一个Create(self)那么一定是有问题的。
freeAndNil 也是错,因为逻辑上错了!
2:qryTemp最好要在自己释放;
3:另外qryTemp在返回记录集后没有关闭就用来执行UPDATE或INSERT操作好象不妥
4:update 时,条件没有不区分大小写
5:没有保证存入的MNID和数据库现有的大小写状态一致
6:接口中 var mnid : TMNID 的作用??
7:不管什么错误都返回'44002'?
8:flag : integer 的作用?
9:没有检查mnid : TMNID的数据是否正常
如果一定要用
var ss:TQuery;
ss:=Tquery.Create(self);
....
self.RemoveComponent(ss);
FreeAndNil(ss);
临时:
ss:=Tquery.Create(nil);
....
FreeAndNil(ss);
如果临时的用ss.free就可以了
FreeAndNil这个不太符合逻辑,如果是全局的,就很有必要