在Delphi XE2中查询中的访问冲突

时间:2013-03-21 04:50:39

标签: delphi delphi-xe2

我在函数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;

3 个答案:

答案 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;