Delphi - Rendszer DSN létrehozása és eltávolítása programból

forráskód letöltése
Mai cikkünkben annak járunk utána, miként tudunk az ODBC adatforrásaink közé egy újabb adatforrás-nevet (DSN – Data Source Name) felvenni, azt hozzárendelni egy általunk létrehozott adatbázishoz, valamint hogyan lehet a teljes adatforrást eltávolítani.
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