TQuery运行时的修改(100分)

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

zhuzi

Unregistered / Unconfirmed
GUEST, unregistred user!
我写的一个DELPHI函数可是每次运行到Tmpparam2.Free;时就会报错,不知为什么,难道TPARAM不
需要释放吗?请高手帮我解决!去掉我注释的那三行程序就不会报错,可加上就会出错。


function InsertTMPRKTM(TmpStr1,TmpStr2,TmpStr3,TmpStr4:string):integer;
var
TmpParam1,TmpParam2,TmpParam3,TmpParam4:TParam;
begin
try
TelxonQuery:=TQuery.Create(nil);
with TelxonQuery do
begin
DatabaseName :=TelxonDatabase.DatabaseName ;
SessionName :=TelxonSession.SessionName ;
if active then close;
Params.Clear ;
TmpParam1:=TParam.Create(Params,ptInput);
TmpParam2:=TParam.Create(Params,ptInput);
TmpParam3:=TParam.Create(Params,ptInput);
TmpParam4:=TParam.Create(Params,ptInput);
try
Params[0].Name:='NewRuKuDan';
Params[0].ParamType :=ptInput;
ParamByName('NewRuKuDan').AsString:=TmpStr1;
Params[1].Name:='Newbox';
Params[1].ParamType :=ptInput;
ParamByName('Newbox').AsString:=TmpStr3;
Params[2].Name:='newshangpin';
Params[2].ParamType :=ptInput;
ParamByName('NewShangPin').AsString:=TmpStr4;
Params[3].Name:='Newcolor';
Params[3].ParamType :=ptInput;
ParamByName('Newcolor').AsString:=TmpStr2;
sql.Clear;
sql.Add('INSERT INTO TMPRKTM (rkdjh, hwtm, hwxftm, hwsx) VALUES (:NewRukuDan,:NewBox,:NewShangPin,:NewColor)');
prepare;
execsql;
Close;
unprepare;
finally
TmpParam1.free;
// Tmpparam2.Free;
// TmpParam3.free;
// Tmpparam4.Free;
Free;
end;
end;
except
on E: Exception do writeln(E.Message);
end;

end;
 
不用释放所有的参数吧,因为父对象释放,子也可以自动释放
 
? 先 sql.text:=strsql;
在 ParamByName('Newbox').AsString:=****;
也不用释放
 
我觉得你的这几句都是错误的
TmpParam1.free;
Tmpparam2.Free;
TmpParam3.free;
Tmpparam4.Free;
肯定会报错丫!我觉得你应该把面向对象的概念好好复习一下!你想丫,
他已经死了,可他还活着,这能理解吗?现在,我的水平也不算很高,明白你错在了哪里!
就是说不出来!我的E-Mail:Vickymade@263.com,告诉我你的E-Mail等我,考虑成熟了,
在告诉你好吗?反正我觉得,你就是在面向对象这里犯了严重的错误,因为以前,我是搞
Visual C++的,所以,一眼就看出来不大对劲儿。
 
不明白你为什么要定义TmpParam1,TmpParam2,TmpParam3,TmpParam4,
但是你后面都用的是TQuery的Params[0],Params[1],TmpParam1根本就没有起什么作用.
你在Tquery中生成参数可以直接用
query1.Params.CreateParam(ftstring,'@P1',ptInput);
//字符型,名字为@P1,输入参数
然后在使用
query1.ParamByName('@P1').asstring := 'abc'; //推荐使用
或者
query1.Params[0].Value := 'abc';
来赋值
 
注意你的tmpParam1,tmpParam2,tmpParam3,tmpParam4创建时调用的是
构造函数constructor Create(AParams: TParams; AParamType: TParamType);
其中AParams是个TParam数组对象,也就是说tmpParam1=Params[0],tmpParam2=Params[1]...,
然后你做了一堆参数赋值的操作。
有趣的是你给SQL赋值之前调用了SQL.Clear,用以清除原有的SQL文本,
但是正是这个语句,因为SQL.Text=‘’了,所以Query控件同时也清除了Params数组的成员
也就是tmpParam1,tmpParam2,tmpParam3,tmpParam4,从这里开始这几个变量指向的对象都已被释放了,
之后的SQL.Add语句给SQL.Text赋值后,Query控件依据SQL.Text重建了参数数组Params,
然后你调用execsql,给数据库插入了一条空记录,(因为Params数组是重新构造的,所有参数
都没有赋值)
然后你开始释放并不存在的tmpParam1到4时,错误发生了。
 
另外,因为Query控件会自动依据其SQL.Text来建立参数数组,
所以你的程序其实可以写得很简单:
...
sql.text:=
'INSERT INTO TMPRKTM (rkdjh, hwtm, hwxftm, hwsx) VALUES (:NewRukuDan,:NewBox,:NewShangPin,:NewColor)';
ParamByName('NewRuKuDan').AsString:=TmpStr1;
ParamByName('Newbox').AsString:=TmpStr3;
ParamByName('NewShangPin').AsString:=TmpStr4;
ParamByName('Newcolor').AsString:=TmpStr2;
Prepare;
ExecSql;

注意调用ExecSQL并不会打开Query,所以也没必要调用Close
 
后退
顶部