class function CDataOperate.GetDataSet(Const SqlStr:String;out DataSet:TDataSet):boolean;
var
QryData:TAdoQuery;
begin
result:=nil;
QryData:=TAdoQuery.Create(nil);
QryData.Close;
QryData.ConnectionString:=ConnStr;
QryData.SQL.Clear;
QryData.SQL.Text:=SqlStr;
try
begin
QryData.Open;
DataSet:=QryData;
result:=true;
QryData.Free; //这句是关键的,如果注释这一句,内存不会报错
end;
except on E:Exception do
begin
QryData.Free;
result:=false;
ShowMessage(E.Message);
end;
end;
end;
//a function//Apply code
procedure TFormMain.Button1Click(Sender: TObject);
var
qry:TDataSet;
begin
SqlStr:='select sysdate from dual';
if CDataOperate.GetDataSet(SqlStr,qry) then
begin
Showmessage('Yeah,Succesfull');
DataSource1.DataSet:=qry;
DbGrid1.DataSource:=DataSource1;
qry.Free;
end
else
begin
Showmessage('Oh,shit,failure');
end;
end;
在函数里面已经采用了Out向外传参的方式,再释放QryData的时候,就会导致内存错误?
有什么办法?
把你的GetDataSet改为FillDataSet就行了,看改过的函数名应该知道怎么做了吧
就是因为被Free掉,所以才会这样出错,但是怎样做得更好呢?