Hur man konstruerar databasanslutningssträngen dynamiskt

När du är klar med din Delphi databaslösning, det sista steget är att framgångsrikt distribuera den användarens dator.

ConnectionString On-The-Fly

Om du använde dbGo (ADO) komponenter,Connection egendom till TADOConnection anger anslutningsinformation för datalagret.

Uppenbarligen, när du skapar databasapplikationer som ska köras på olika maskiner, bör anslutningen till datakällan inte vara hårdkodad i körbara. Med andra ord kan databasen vara placerad var som helst på användarens dator (eller på någon annan dator i ett nätverk) - anslutningssträngen som används i TADOConnection-objektet måste skapas på körtid. En av de föreslagna platserna att lagra parametrarna för anslutningssträngen är Windows-register (eller kanske du bestämmer dig för att använda "vanligt" INI-filer).

I allmänhet, för att skapa anslutningssträngen vid körningstid du måste
a) placera Full Path till databasen i registret; och
b) läsa informationen från registret varje gång du startar din applikation, "skapa" ConnectionString och "öppna" ADOConnection.

instagram viewer

Databas... Ansluta!

För att hjälpa dig förstå processen har vi skapat en "skelett" -applikation som består av en form (applikationens huvudform) och en datamodul. Delphis datamoduler tillhandahåller ett bekvämt organisationsverktyg som används för att isolera de delar av din applikation som hanterar databasanslutning och affärsregler.

De onCreate händelse av datamodulen är där du placerar koden för att dynamiskt konstruera ConnectionString och ansluta till databasen.

procedur TDM.DataModuleCreate (avsändare: TObject); Börjaom DBConnect sedan
ShowMessage ('Ansluten till databas!')
annan
ShowMessage ('INTE ansluten till databas!'); slutet;

Notera: Namnet på datamodulen är "DM". Namnet på TADOConnection-komponenten är "AdoConn".

De DBConnect funktionen gör själva anslutningen till databasen, här är koden:

function TDM.DBConnect: boolean; var
conStr: sträng; Servernamn, DBName: string; BörjaServernamn: = ReadRegistry ('DataSource'); DBName: = ReadRegistry ('DataCatalog'); conStr: = 'Provider = sqloledb;' + 'Datakälla =' + Servernamn + ';' + 'Initial Catalog =' + DBName + ';' + 'Användar-id = myUser; Lösenord = myPasword '; Resultat: = falsk; AdoConn. Stänga; AdoConn. ConnectionString: = conStr; AdoConn. LoginPrompt: = Falsk;om (INTE AdoConn. Ansluten) sedanProva
AdoConn. Öppen; Resultera: = true; bortsett från E: Undantag doBörjaMessageDlg ('Det uppstod ett fel vid anslutningen till. databasen. Fel: '+ # 13 # 10 + e. Meddelande, mtError, [mbOk], 0);omINTE TDatabasePromptForm. Kör (Servernamn, DBName)
sedan
Resultat: = falskt. annanBörja
WritRegistry ('DataSource', ServerName); WritRegistry ('DataCatalog', DBName); // minns den här funktionen
Resultat: = DBConnect; slutet; slutet; slutet; slutet; //DBConnect

DBConnect-funktionen ansluts till MS SQL Server-databasen - ConnectionString konstrueras med den lokala connStr variabel.

Namnet på databasservern lagras i Server namn variabeln, databasens namn finns i databasnamn variabel. Funktionen börjar med att läsa de två värdena från registret (med anpassningen ReadRegistry () procedur). När ConnectionString har monterats, ringer vi helt enkelt sedan AdoConn. Öppen metod. Om detta samtal returnerar "sant" har vi anslutit oss till databasen.

Obs: Eftersom vi uttryckligen skickar inloggningsinformation via ConnectionString, är sedan datamodulen skapad före huvudformuläret kan du säkert ringa metoderna från datamodulen i MainForms OnCreate händelse.LoginPrompt egenskapen är inställd på falsk för att förhindra en onödig inloggningsdialog.

"Roligt" börjar om ett undantag inträffar. Även om det kan finnas många skäl till att Open-metoden misslyckas, låt oss anta att servernamnet eller databasnamnet är dåligt.
Om så är fallet ger vi en chans till användaren att ange rätt parametrar genom att visa en anpassad dialogformulär.
Exempelapplikationen innehåller också ytterligare ett formulär (DatabasePromptForm) som gör det möjligt för användaren att ange servern och databasnamnet för Connection-komponenten. Denna enkla form innehåller bara två redigeringsrutor, om du vill tillhandahålla ett mer användarvänligt gränssnitt kan du göra det lägg till två ComboBoxer och fyll dem genom att räkna upp tillgängliga SQL-servrar och hämta databaser på en SQL Server.

DatabasPrompt-formuläret innehåller en anpassning klassmetod heter Execute som accepterar två variabla (var) parametrar: Servernamn och DBName.

Med de "nya" data som tillhandahålls av en användare (server- och databasnamn) kallar vi helt enkelt DBConnect () -funktionen igen (rekursivt). Naturligtvis lagras informationen först i registret (med en annan anpassad metod: WritRegistry).

Se till att DataModule är det första "formuläret" skapat!

Om du försöker skapa detta enkla projekt på egen hand, kan det hända att du upplever undantag för åtkomstbrott när du kör applikationen.
Som standard kommer det första formuläret som läggs till i applikationen att vara MainForm (det första skapat). När du lägger till en datamodul till applikationen läggs datamodulen till i listan med "auto-skapa formulär" som den form som skapas efter huvudformuläret.
Om du försöker anropa någon av datamodulens egenskaper eller metoder i OnCreate-händelsen i MainForm får du ett undantag för åtkomstöverträdelse - eftersom datamodulen ännu inte är skapad.
För att lösa problemet måste du manuellt ändra den skapade ordningen för datamodulen - och ställa in den till att vara den det första formuläret som skapas av applikationen (antingen med hjälp av dialogrutan Projektegenskaper eller genom redigering de Projekt källfil).

Eftersom datamodulen skapas före huvudformuläret kan du säkert ringa metoderna från datamodulen i MainForms OnCreate-händelse.

instagram story viewer