1

qryDoABCfunction で言うクエリがありますDoABC。この関数を初めて呼び出すと、すべて正常に動作しますが、2 回目に呼び出すと、qryDoABC do の行でアクセス違反の例外がスローされます。

procedure TMyForm.DoABC;
begin
  with qryDoABC do
  --
  -- 
end;

グーグルで調べたところ、クエリが割り当てられているかどうかを確認する必要があることがわかりました。そのため、クエリが次のように割り当てられているかどうかも確認しています。

procedure TMyForm.DoABC;
begin
  if assigned qryDoABC then
  with qryDoABC do
  --
  -- 
end;

2回目のクエリが割り当てられていないため、例外はありません。しかし、私はこのqryを2回も発射しなければなりません。このクエリを 2 回目に割り当てるにはどうすればよいですか。

完全なコード:

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 はフォーム上のコンポーネントですか? その場合、フォームが削除されると、おそらく 2 回目に呼び出されます。その場合、フォームのリリースが早すぎるか、クエリの呼び出しが遅くなります。

フォームを手動で解放し、2 番目のクエリ呼び出しがイベント ハンドラーの結果である場合、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;

しかし、私はステートメントを使用して破棄し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;
于 2013-03-22T08:12:27.697 に答える