gpt4 book ai didi

MySQL 连接提示输入密码,即使它在连接字符串中

转载 作者:可可西里 更新时间:2023-11-01 07:47:13 25 4
gpt4 key购买 nike

这个看起来很奇怪。

我有一个连接到 MySQL 数据库的 Pascal 单元

unit u_MySQLConnection;

interface

uses
ADODB,
AnsiStrings,
Generics.Collections,
SysUtils,
DB
;

type
TMySQLConnection = class
strict private
mysqlCon : TADOConnection;
public
function Connect:boolean;
destructor Destroy;
end;

var
MySQLConnection : TMySQLConnection;

implementation

function TMySQLConnection.Connect:boolean;
var
success : boolean;
begin

success := true;
try

if NOT (mysqlCon = nil)
then mysqlCon.Destroy;

mysqlCon := TADOConnection.Create(nil);

mysqlCon.ConnectionString := 'DRIVER={MySQL ODBC 3.51 Driver}; SERVER=localhost; DATABASE=database; UID=root; PASSWORD=password;OPTION=3;';

except
success := false;
end;

Result := success;
end;

destructor TMySQLConnection.Destroy;
begin
FreeAndNil(mysqlCon);
inherited;
end;

end.

当我尝试连接时

MySQLConnection := TMySQLConnection.Create;

try
MySQLConnection.Connect;
finally
MySQLConnection.Destroy;
end;

即使密码已经在连接字符串中,我也会出现一个密码提示对话框。如果我在此提示中输入用户名和密码,其他一切正常。

这里的事情变得有点奇怪:

当我将数据库连接命令移动到主 .dpr 文件中时,如图所示

program DieselBatch;

uses
Vcl.Forms,
u_MySQLConnection in '..\src\u_MySQLConnection.pas'
(*,
frm_About in '..\src\frm_About.pas' {frmAbout},
frm_AnalystDetails in '..\src\frm_AnalystDetails.pas' {frmAnalystDetails},
frm_Batch in '..\src\frm_Batch.pas' {frmBatch},
frm_ConfirmResultsChanged in '..\src\frm_ConfirmResultsChanged.pas' {frmConfirmResultsChanged},
frm_DebugSample in '..\src\frm_DebugSample.pas' {frmDebugSample},
frm_FlashManualEntry in '..\src\frm_FlashManualEntry.pas' {frmFlashEntry},
frm_Main in '..\src\frm_Main.pas' {frmMain},
frm_SampleComment in '..\src\frm_SampleComment.pas' {frmSampleComment},
frm_SelectAnalystForResult in '..\src\frm_SelectAnalystForResult.pas' {frmSelectAnalystForResult},
u_Data in '..\src\u_Data.pas',
u_MicroCheck in '..\src\u_MicroCheck.pas',
u_Undo in '..\src\u_Undo.pas'
*)
;

{$R *.res}

var
MySQLConnection : TMySQLConnection;

begin

MySQLConnection := TMySQLConnection.Create;

try
MySQLConnection.Connect;
finally
MySQLConnection.Destroy;
end;

然后就不会出现密码提示了,只要把那些单元都注释掉就可以了。

当我再次取消注释上述单元时,问题再次出现。

其中一些单元确实使用 ADODB 和 DB,但我看不出这些单元的存在如何影响 MySQLConnection 单元的行为......

最佳答案

简答

将连接对象的 LoginPrompt 属性设置为 False

为什么评论所有的表单单元都没有出现?

那么,TCustomConnection 后代的常用 DoConnect 方法会检查 LoginPrompt 属性,然后调用 LoginDialogProc/LoginDialogExProc 过程变量(如果已分配)。变量在 Data.DB.pas 中声明。

VCL本身在VCL.DBLogDlg.pas单元的initialization部分给这个变量赋值,里面包含了你看到的标准对话框,这个单元是用到的由 DBCtrls.pas 单元,并在您使用任何数据感知控件时自动添加到您的项目中。

如果您注释掉所有包含数据感知控件的单元,则 DBCtrls.pas 单元不会链接到您的可执行文件中,因此没有注册登录对话框在您连接时显示。

关于MySQL 连接提示输入密码,即使它在连接字符串中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14948160/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com