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