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

时间:2013-02-19 01:07:17

标签: mysql delphi odbc

这个看起来很奇怪。

我有一个连接到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单位的行为....

1 个答案:

答案 0 :(得分:12)

简短回答

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

为什么在评论所有表单单元时不会出现?

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

VCL本身会在initialization单元的VCL.DBLogDlg.pas部分中分配此变量,其中包含您看到的标准对话框,此单元由DBCtrls.pas单元使用,使用任何数据感知控件时自动添加到项目中。

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