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

这个看起来很奇怪.

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

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单元的初始化部分分配这些变量,其中包含您看到的标准对话框,并且该单元由DBCtrls.pas单元使用,并在您使用任何单元时自动添加到您的项目中数据感知控制.

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

上一篇:笔记_数据库


下一篇:删除/编辑MySQL ODBC链接表中的行会导致MS Access出错