TADOConnection u Delphiju: ispravan način da se koristi LoginPrompt := True

LoginPrompt := True na komponenti TADOConnection u Delphiju prikazuje standardni prozor za unos korisničkog imena i lozinke pre povezivanja na SQL Server. Ovde je primer kako da se to pravilno iskoristi zajedno sa podešavanjima veze iz INI fajla.

Primer koda

Dugo mi nije bilo jasno šta LoginPrompt := True zapravo radi. Ispravan način da se koristi je sledeći:

procedure TfrmMain.FormShow(Sender: TObject);
var
  i: integer;
begin
  con1.Provider := 'SQLOLEDB.1';
  con1.Properties['Application Name'].Value := Application.Title;
  with TIniFile.Create(ExtractFileDir(ParamStr(0)) + '\setup.ini') do
  begin
    con1.Properties['Initial Catalog'].Value := ReadString('database', 'Initial Catalog', '');
    con1.Properties['Data Source'].Value := ReadString('database', 'Data Source', '');
    if ReadBool('database', 'Integrated Security', false ) then
    begin
      con1.Properties['Integrated Security'].Value := 'SSPI';
      con1.Properties['Persist Security Info'].Value := 'False';
      con1.LoginPrompt := False;
    end
    else
    begin
      con1.Properties['Persist Security Info'].Value := 'True';
      con1.LoginPrompt := true;
    end;
  end;
end;

procedure TfrmMain.con1Login(Sender: TObject; Username, Password: string);
begin
  con1.Properties['User ID'].Value := Username;
  con1.Properties['Password'].Value := Password;
end;
  

Kako radi?

  1. U događaju FormShow se postavlja provajder, a osnovna obeležja veze (Data Source i Initial Catalog) čitaju se iz fajla setup.ini koji stoji pored programa.
  2. Ako je u fajlu uključena Windows autentikacija (Integrated Security), veza koristi SSPI i LoginPrompt se isključuje, jer korisničko ime i lozinka nisu potrebni.
  3. U suprotnom se koristi SQL Server autentikacija i LoginPrompt se uključuje. Kada program otvori vezu (Open ili Connected := True), korisnik dobija prozor za unos korisničkog imena i lozinke.
  4. Posle unosa se poziva događaj OnLogin (u primeru con1Login), koji primljene vrednosti upisuje u obeležja User ID i Password.

Vrednosti treba upisivati preko kolekcije Properties, a ne menjanjem teksta veze (ConnectionString), na primer funkcijom StringReplace. Izmena samog teksta veze u ovom slučaju ne radi.

Primer INI fajla

Kod čita odeljak [database] iz fajla setup.ini:

[database]
Data Source=SERVER\SQLEXPRESS
Initial Catalog=MojaBaza
Integrated Security=0

ReadBool vrednost 1 tumači kao True, a 0 kao False. Za Windows autentikaciju dovoljno je upisati Integrated Security=1.

Na šta treba paziti

  • Standardni prozor za prijavu dolazi iz jedinice DBLogDlg (u novijim verzijama Delphija Vcl.DBLogDlg), pa ona mora biti uključena u uses listu.
  • Provajder SQLOLEDB je zastareo. Za nove programe Microsoft preporučuje OLE DB Driver for SQL Server (provajder MSOLEDBSQL), a u ovom kodu se menja samo prva linija.
  • Persist Security Info = True ostavlja lozinku u tekstu veze i posle povezivanja. To ima smisla samo ako program kasnije ponovo koristi isti tekst veze; u suprotnom je bezbednije False.

Podešavanje veze sa bazom deo je gotovo svakog desktop programa koji radi sa podacima. Šta još obuhvata izrada takvih programa opisano je u tekstu o izradi programa.