1

qryDoABC在函数中有一个查询DoABC。当我第一次调用此函数时,一切正常,但第二次调用它时,与 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;
4

3 回答 3

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;
于 2013-03-21T06:42:51.203 回答
0

qryDoABC 是表单上的组件吗?如果是这样,如果表单被删除,它可能会被第二次调用。在这种情况下,表单要么发布得太早,要么查询调用太晚。

如果您手动释放表单,并且第二个查询调用是事件处理程序的结果,则可以使用 Release 释放表单,这仅在处理消息队列时才释放表单,因此表单没有待处理的消息。

于 2013-03-21T06:49:13.583 回答
-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;

但是我放弃了 usingWith语句并像这样编写了我的代码

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;
于 2013-03-22T08:12:27.697 回答