Reputation: 2150
This one looks like a bizarre one.
I have a Pascal unit that connects to a MySQL database
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.
And when I try to connect
MySQLConnection := TMySQLConnection.Create;
try
MySQLConnection.Connect;
finally
MySQLConnection.Destroy;
end;
I get a password prompt dialog box appearing, even though the password is already in the connection string. If I enter the username and password into this prompt, everything else works fine.
Things get a little bit more strange here:
When i move the database connection command into the main .dpr file as shown
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;
Then the password prompt does not appear, as long as those units are commented out.
When I uncomment the above units again, the problem reappears.
Some of those units do use ADODB and DB but I can't see how the mere presence of the units should affect the behavour of the MySQLConnection unit ....
Upvotes: 3
Views: 1170
Reputation: 17203
Set the LoginPrompt
property of the connection object to False
.
Well, the common DoConnect method of the TCustomConnection descendants checks the LoginPrompt
property and then calls the LoginDialogProc
/LoginDialogExProc
procedural variable if assigned. The variables are declared in Data.DB.pas
.
The VCL itself assigns this variables in the initialization
section of the VCL.DBLogDlg.pas
unit, which contains the standard dialog box you see, and this unit is used by the DBCtrls.pas
unit, and automatically added to your project when you use any data-aware control.
If you comment out all the units containing data aware controls, the DBCtrls.pas
unit is not linked in your executable and, as a consequence there's no registered login dialog to show when you're connecting.
Upvotes: 12