delphi - 在不使用 TDatabase 绕过的情况下禁用登录提示

标签 delphi odbc delphi-5 bde tquery

我当前正在尝试使用 SQL Server 的 ODBC 别名连接到数据库。我遇到的问题是,当我使用 TQuery 对象获取信息时,它总是请求登录详细信息(不管我是否在 ODBC 创建中指定了它们)。我不介意在代码中手动设置它们,但我找不到如何做到这一点。
我发现的最常见的解决方案是使用数据库组件并完成它。但这也有其自身的问题。由于我的数据集太大,并且数据库组件将数据集转换为 Paradox 表,我不断收到“临时表资源限制”的 BDE 错误。 如果我忽略数据库组件(这很好),我不会收到此错误,但这会给我带来登录提示问题。有没有人找到一种方法可以绕过 TQuery 的此问题,而无需交换到其他连接路径(例如 ADO)?

最佳答案

我对 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;

如您所见,如果 session 找不到具有正确名称的现有 TDatabase 组件,它会创建一个临时组件,并且是对 Result.Open 的调用弹出登录提示,没有,到目前为止我可以看到,让您有机会在弹出窗口之前提供密码+用户名(在此过程中似乎没有调用 session 的 OnPassword)。

显然,您需要使用调试器检查您的应用程序中是否发生了这种情况,我的意思是创建了一个临时 TDatabase。

如果我在下面的更新中提出的建议不起作用,并且我非常想避免使用 TDatabase 组件,我会研究派生 TQuery 后代的可能性,并尝试覆盖它的 OpenCursor,看看我是否可以输入用户名/密码。

无论如何,正如你所说,如果我理解正确的话,你没有使用显式的 TDatabase,因为“临时表...”问题,而且 session 无论如何都会创建一个临时表,我想也许值得您研究一下为什么临时组件不会引发“临时表”错误,而在应用程序中使用 TDatabase 组件显然会引发“临时表”错误。也许是 Idapi32.Cfg 配置问题?目前,我无法帮助您解决此问题,因为我无法重现您的“临时表”错误,尽管使用我的 TQuery 在 SqlServer 表上执行 SELECT 以返回 250,000 多行。

哦,这是一点:你的表包含任何 BLOB 吗?我似乎记得有一个 Idapi 配置参数,可以让您减少 BDE 用于 BLOB 的临时存储空间(也许为零,但自从我“真正”使用 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 提出一个有趣的问题。

关于delphi - 在不使用 TDatabase 绕过的情况下禁用登录提示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27230917/

相关文章:

windows - 如何让我的 Delphi 5 应用程序显示密码 "blobs"?

delphi - 如何制作当另一个表单以模态方式显示时不被禁用的表单?

delphi - 如何正确恢复FMX表单?

delphi - 我可以定义只能包含这些值的 MyType 吗?

sqlite - 无法通过 ODBC 连接 Access 到 SQLite

sql-server - Linux 中的 MSSQL ODBC 连接

mysql - 尝试使用 DSN 连接到 MySql 时出错

delphi - Vista 中的文本转语音

delphi - 在 ADO 异步回调期间无法将对象添加到 GlobalInterfaceTable

delphi - Delphi5中浮点除零异常