A feladat megoldásához segítségül hívjuk az ODBCCP32.DLL-t, amely segítségével hozzáférhetünk az SQLConfigDataSource folyamathoz, melynek paraméterként átadjuk a létrehozandó adatforrás, illetve a hozzá kapcsolódó adatbázis tulajdonságait. Lássuk a forráskódot:
procedure TForm1.Button1Click(Sender: TObject);
var
pFn: TSQLConfigDataSource;
hLib: LongWord;
strDriver: string;
strHome: string;
strAttr: string;
strFile: string;
fResult: BOOL;
ModName: array[0..MAX_PATH] of Char;
srInfo : TSearchRec;
begin
A GetModuleFileName függvény segítségével lekérdezzük, hogy melyik könyvtárból futtatjuk a programunkat. Az aktuális elérési útvonal a ModName bufferben kerül eltárolásra. Azért van szükségünk erre, mert a későbbiekben ebbe a könyvtárba fogjuk létrehozni az adatforráshoz tartozó adatbázisunkat.
GetModuleFileName(HInstance, ModName, SizeOf(ModName));
Az strHome sztring típusú változónak átadjuk a kapott elérési útvonalat. Mivel ez a jelenlegi alkalmazásunk nevét is tartalmazza, így azt le kell törölnünk az útvonalból. A while ciklus ezt valósítja meg. Mindaddig visszatörli az elérési útvonalat, míg „\” jelre nem talál. Ezzel az alábbi formájú sztringet kapjuk:
meghajtó\könyvtár\[alkönyvtár\]
strHome := ModName;
while(strHome[length(strHome)] <> '\') do
Delete(strHome, length(strHome), 1);
Az strFile változóban elkészítjük a létrehozandó teszt-adatbázisunk teljes elérési útvonalát. Esetünkben egy Access adatbázist fogunk hozzárendelni az adatforráshoz.
strFile := strHome + 'TestData.MDB';
A LoadLibrary függvény segítségével betöltjük az ODBCCP32.DLL-t, melyre ezentúl a hLib változóval hivatkozunk.
hLib := LoadLibrary('ODBCCP32');
Amennyiben sikeres volt a DLL betöltése, a GetProcAddress függvénnyel megszerezzük az SQLConfigDataSource függvény hivatkozási címét, melyre ezentúl a pFn nevű mutatóval hivatkozunk.
if(hLib <> NULL) then
begin
@pFn := GetProcAddress(hLib, 'SQLConfigDataSource');
Ha sikerült megszereznünk a címet, elkészítjük a DSN paramétereit az strAttr változóban. Itt megadjuk a nevét, leírását, valamint azt, hogy melyik adatbázishoz csatlakozzon.
if(@pFn <> nil) then
begin
strDriver := 'Microsoft Access Driver (*.mdb)';
strAttr := Format('DSN=TestDSN'+#0+
'DBQ=%s'+#0+
'Exclusive=1'+#0+
'Description=Test Data'+#0+#0,
[strFile]);
A pFn által hivatkozott függvénynek az ODBC_ADD_SYS_DSN paraméterrel jelezzük, hogy rendszer-DSN-t kell létrehozni, valamint átadjuk a létrehozandó adatforrás nevét és típusát.
fResult := pFn(0, ODBC_ADD_SYS_DSN, @strDriver[1], @strAttr[1]);
if(fResult = false) then ShowMessage('A DSN (Datasource) létrehozása nem sikerült!');
Ezután a fentiekhez hasonló módon létrehozzuk az adatforráshoz tartozó adatbázist is, azzal a különbséggel, hogy az strAttr változóban jelezzük a CREATE_DB megadásával, hogy az strFile-ban tárolt elérési útvonalon és néven létre kell hozni egy állományt.
if(FindFirst(strFile, 0, srInfo) <> 0) then
begin
strDriver := 'Microsoft Access Driver (*.mdb)';
strAttr := Format('DSN=TestDSN'+#0+
'DBQ=%s'+#0+
'Exclusive=1'+#0+
'Description=Test Data'+#0+
'CREATE_DB="%s"'#0+#0,
[strFile,strFile]);
fResult := pFn(0, ODBC_ADD_SYS_DSN, @strDriver[1], @strAttr[1]);
if(fResult = false) then ShowMessage('Az MDB (Database file) létrehozása nem sikerült!');
end;
Végül felszabadítjuk a lefoglalt erőforrásokat.
FindClose(srInfo);
end;
FreeLibrary(hLib);
end
else
ShowMessage('Nem lehet betölteni az ODBCCP32.DLL-t!');
end;
Amennyiben sikerült a rendszer-DSN létrehozása, a Vezérlőpult -> Felügyeleti eszközök -> ODBC adatforrások -> Rendszer DSN fülére kattintva meg kell jelenjen a TestDSN nevű adatforrásunk. Erre duplán kattintva megkapjuk annak tulajdonságlapját, melyen látható a leírása, valamint hogy melyik adatbázishoz kapcsolódik.
A DSN és a hozzá tartozó adatbázis eltávolítása a fentiekhez teljesen hasonló módon történik, azzal a különbséggel, hogy a pFn függvénynek az ODBC_REMOVE_SYS_DSN paramétert kell átadni. Összességében a következő paraméterek használhatók:
- ODBC_ADD_DSN = 1; Adatforrás hozzáadása, létrehozása
- ODBC_CONFIG_DSN = 2; Adatforrás szerkesztése, konfigurálása
- ODBC_REMOVE_DSN = 3; Adatforrás eltávolítása
- ODBC_ADD_SYS_DSN = 4; Rendszer DSN hozzáadása, létrehozása
- ODBC_CONFIG_SYS_DSN = 5; Rendszer DSN szerkesztése, konfigurálása
- ODBC_REMOVE_SYS_DSN = 6; Rendszer DSN eltávolítása