D2010、Win7 64位。你好,
我有一个buttonClick事件,需要处理在另一个例程中打开的TDataSet ...GetDBGenericData。
函数GetDBGenericData返回一个TDataSet。这个例程主要是获取一个tQuery组件,设置它的SQL属性,然后打开它。然后,它将TDataSet返回给我的按钮单击。
procedure TForm1.Button2Click(Sender: TObject);
var
DS : TDataSet;
begin
DS := TDataSet.Create(nil);
DS := GetDBGenericData(dbSOURCE, 'LIST_ALL_SCHEMAS', [] );
while Not DS.EOF do
begin
ShowMessage(DS.FieldByName('USERNAME').AsString);
DS.Next;
end;
DS.Close;
DS.Free;我的问题是--理解DS。我在这个例程中创建了它。我将它“赋值”给一个指向组件的TDataSet。如果我不释放它,我就会发生内存泄漏(据EurekaLog报道)。如果我释放了它,我会在下一次运行这个例程时得到一个AV。(特别是在GetDBGenericData例程中)。
我认为发生的情况是DS被分配给(而不是复制)返回的TDataSet,所以实际上,当我执行空闲操作时,我释放了这个例程中的DS和GetDBGenericData中的tQuery。
如何“断开”链接,然后删除仅与我动态创建的内存相关联的内存。
谢谢,GS
发布于 2011-10-25 07:16:18
如果您的DS变量被GetDBGenericData分配了另一个TDataSet,那么您既不应该使用Create,也不应该使用Free。您只是使用它来引用现有的数据集。
procedure TForm1.Button2Click(Sender: TObject);
var
DS : TDataSet;
UserNameField: TField; // Minor change for efficiency
begin
DS := GetDBGenericData(dbSOURCE, 'LIST_ALL_SCHEMAS', [] );
// Call FieldByName only once; no need to create or
// free this either.
UserNameField := DS.FieldByName('USERNAME');
while not DS.Eof do
begin
ShowMessage(UserNameField.AsString);
DS.Next;
end;
// I'd probably remove the `Close` unless the function call
// above specifically opened it before returning it.
DS.Close;
end;https://stackoverflow.com/questions/7883019
复制相似问题