我在函数qryDoABC
中有一个查询说DoABC
。当我第一次调用此函数时,一切正常,但第二次调用时,与qryDoABC一致,它会抛出访问冲突异常。
procedure TMyForm.DoABC;
begin
with qryDoABC do
--
--
end;
我用Google搜索并发现我应该检查是否分配了查询。所以现在我也在检查是否分配了查询:
procedure TMyForm.DoABC;
begin
if assigned qryDoABC then
with qryDoABC do
--
--
end;
现在没有例外,因为没有分配第二次查询。但我也要第二次开火。我该如何在第二次分配此查询。
完整代码:
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;
答案 0 :(得分:0)
将查询变量用作本地。在你的函数中声明它。并使用'TRY ... FINALLY'免费查询。
function TMyForm.DoABC:boolean;
var
qryDoABC: TADOQuery;
begin
try
qryDoABC := TADOQuery.Create(nil);
//Set Appropriate Connection String (below for MS-Access)
qryDoABC.ConnectionString := 'Provider=Microsoft.Jet.OLEDB.4.0; Data Source=MDB_file';
try
with qryDoABC do
begin
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;
end;
end;
finally
FreeAndNil(qryDoABC);
end;
end;
答案 1 :(得分:0)
qryDoABC是表单上的一个组件吗?如果是这样,如果表单被删除,它可能是第二次调用。在这种情况下,表单要么过早发布,要么查询被调用到很晚。
如果手动释放表单,并且第二个查询调用是事件处理程序的结果,则可以使用Release释放表单,只有在处理消息队列时才释放表单,因此没有待处理的消息形式左。
答案 2 :(得分:-1)
我正在使用像这样的TADOQuery语法
with qryDoABC do
begin
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;
但我放弃使用With
语句并编写了我的代码
qryDoABC.SQL.Clear;
qryDoABC.SQL.Text := 'Some query';
qryDoABC.Parameters.ParamByName('ABC').Value := 'ABC';
qryDoABC.Parameters.ParamByName('XYZ').Value := 'XYZ';
qryDoABC.Open;
if (qryDoABC.Recordcount = 0) then
result := false
else
begin
result := true;
end;
qryDoABC.Close;