【发布时间】:2013-03-21 04:50:38
【问题描述】:
我在函数DoABC 中有一个查询说qryDoABC。当我第一次调用此函数时,一切正常,但第二次调用它时,与 qryDoABC 一致,它会引发访问冲突异常。
procedure TMyForm.DoABC;
begin
with qryDoABC do
--
--
end;
我搜索了一下,发现我应该检查是否分配了查询。所以现在我也在检查是否像这样分配查询:
procedure TMyForm.DoABC;
begin
if assigned qryDoABC then
with qryDoABC do
--
--
end;
现在也不例外,因为没有分配第二次查询。但我也必须第二次解雇这个 qry。我应该如何第二次分配这个查询。
完整代码:
function TMyForm.DoABC:boolean;
begin
try
if assigned(qryDoABC)then
with qryDoABCdo
begin
Close ;
SQL.Clear;
SQL.Text :=
'Some query';
Parameters.ParamByName('ABC').Value := ABC;
Parameters.ParamByName('XYZ').Value := XYZ;
Open;
if (Recordcount = 0) then
result := false
else
begin
result := true;
end;
Close;
end;
except
on E : Exception do
begin
result := false;
exit;
end;
end;
end;
【问题讨论】:
-
显示您的方法的完整代码。同时,检查你是否没有
Free里面的那个查询对象。 -
@TLama - 我已添加完整代码
-
这里缺少重要的部分,因为如果您说第二次未分配查询对象,那么您必须在代码中的某处使用
Free和/或nil。 -
@TLama - 我有一个 Form1 和 Form2。当我单击 Form1 的 OK 按钮时,此查询会触发,如果一切正常,我会跳转到 Form2。现在,如果我在那里按 ESC,我再次来到 Form1。现在,如果我按下那里的按钮,我会收到错误消息。我没有在任何地方使用 Free 或 Nil 关键字
-
在 Form1 上显示 OnClick OK 按钮的代码。您是否在模态模式下显示 Form2?即Form2.ShowModal?此外,删除 with 语句 - 如果没有别的,它将有助于减少 DoABC 中的潜在问题。 TMyForm 实际上是 Form1 吗?我的猜测是,无论您是否直接释放了 qryDoAB 形式的任何实例,都已被释放。如果调用了 qryDoABC.Free,如果 Assigned(qryDoABC) 仍将“通过”(返回 True)。
标签: delphi delphi-xe2