1

現在、SQL Server への ODBC エイリアスを使用してデータベースに接続しようとしています。私が抱えている問題は、TQuery オブジェクトを使用して情報を取得するときに、常にログインの詳細を要求することです (ODBC の作成で指定したかどうかは気にしないでください)。コードで手動で設定してもかまいませんが、その方法がわかりません。
私が見つけた最も一般的な解決策は、データベース コンポーネントを使用してそれを実行することです。ただし、それには独自の問題があります。データセットが非常に大きく、データベース コンポーネントがデータセットを Paradox テーブルに変換しているため、「Temporary Table Resource Limit」という BDE エラーが発生し続けます。データベース コンポーネントを無視すると (これで問題ありません)、このエラーは発生しませんが、ログイン プロンプトの問題が残ります。ADO などの他の接続パスにスワップせずに、TQuery でこれをバイパスする方法を見つけた人はいますか?

4

1 に答える 1

4

私は BDE に少し慣れていませんが、プロジェクトで TDatabase コンポーネントを使用していないということであれば、ログイン プロンプトを回避する簡単な方法はないと思います。

その理由は、プロジェクトで TDatabase (または TSession) コンポーネントなしで TQuery を開こうとすると、アプリのデフォルトの Session オブジェクトが TQuery の OpenCursor 内から以下のルーチンを呼び出すためです。

{ from DBTables.Pas }
function TSession.DoOpenDatabase(const DatabaseName: string; AOwner: TComponent): TDatabase;
var
  TempDatabase: TDatabase;
begin
  Result := nil;
  LockSession;
  try
    TempDatabase := nil;
    try
      Result := DoFindDatabase(DatabaseName, AOwner);
      if Result = nil then
      begin
        TempDatabase := TDatabase.Create(Self);
        TempDatabase.DatabaseName := DatabaseName;
        TempDatabase.KeepConnection := FKeepConnections;
        TempDatabase.Temporary := True;
        Result := TempDatabase;
      end;
      Result.Open;
      Inc(Result.FRefCount);
    except
      TempDatabase.Free;
      raise;
    end;
  finally
    UnLockSession;
  end;
end;

ご覧のとおり、セッションが正しい名前の既存の TDatabase コンポーネントを見つけられない場合、一時的なコンポーネントが作成されます。ログイン プロンプトをポップアップ表示するのは Result.Open の呼び出しです。 、ポップアップの前にパスワードとユーザー名を提供する機会を与えます (セッションの OnPassword は、この過程で呼び出されないようです)。

明らかに、デバッガを使用して、それがアプリで起こっていること、つまり一時的な TDatabase が作成されていることを確認する必要があります。

以下のアップデートで提案したことがうまくいかず、TDatabase コンポーネントの使用をどうしても避けたい場合は、TQuery の子孫を派生させる可能性を調べ、その OpenCursor をオーバーライドしてジャムできるかどうかを確認します。ユーザー名/パスワードに。

とにかく、あなたが明示的な TDatabase を使用していないと言っているのを見て、私があなたを正しく理解していれば、「Temporary Table ...」の問題のために、セッションがとにかく一時的なテーブルを作成するので、おそらくアプリでTDatabaseコンポーネントを使用すると明らかに発生するのに、一時的なもので「一時テーブル」エラーが発生しない理由を調査する価値があります。Idapi32.Cfg 構成の問題でしょうか? TQueryを使用してSqlServerテーブルでSELECTを実行し、250,000行以上を返すにもかかわらず、「一時テーブル」エラーを再現できないため、現時点ではお手伝いできません。

重要なのは、テーブルに BLOB が含まれているかどうかです。BDE が BLOB に使用する一時ストレージ スペースを減らすことができる Idapi 構成パラメーターがあることを思い出したようです (おそらくゼロにしますが、BDE を「実際に」使用してから長い時間が経ちました)。

更新: あなたのクエリは、TDatabase オブジェクトを動的に作成する Session で動作するように見えるので、自分で動的に作成する TDatabase でも動作するのではないかと思いました。私はちょうど次のことを試しました、そしてそれは私のために働きます:

procedure TForm1.DatabaseLogin(Database: TDatabase;
  LoginParams: TStrings);
begin
  LoginParams.Add('user name=sa');
  LoginParams.Add('password=1234');  
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  ADatabase : TDatabase;
begin
  ADatabase := TDatabase.Create(Self);
  ADatabase.AliasName := 'MAT41032';
  ADatabase.DatabaseName := 'MAT41032';
  ADatabase.SessionName := 'Default';
  ADatabase.OnLogin := DatabaseLogin;
  Query1.Open;
end;

ところで、興味深い質問に+1。

于 2014-12-01T19:13:02.710 に答える