Delphi - Linkelt szerver csatolása tárolt eljárással

forráskód letöltése
A Microsoft SQL Server 2000 hasznos tulajdonságokkal bővült a korábbi verziókhoz képest. Ezek közé tartozik az a lehetőség, melynek segítségével képesek vagyunk linkelt szerverként hozzáadni a megadott adatbázist a MS SQL 2000 szerverhez, majd programjainkból annak információit közvetlenül elérni. Cikkünkben bemutatjuk, milyen egyszerűen tehető ez meg egy Microsoft Access adatbázis esetén.
A példához szükséges a SampleDB adatbázis, melyet a mellékelt Run.cmd BATCH állomány lefuttatásával hozhatunk létre. Csak arra kell ügyelni, hogy a SampleDB.sql parancsállomány a BATCH állománnyal azonos mappában legyen. A SampleDB.sql parancsállomány 5. sorában adja meg helyesen a létrehozandó adatbázisfájlok mappájának nevét és elérési útvonalát.
A megfelelő jogosultságok birtokában képesek vagyunk nem-SQL Server adatbázisokat úgynevezett linkelt szerverként kvázi az SQL Server 2000 adatbázis részévé tenni, és a csatolt szerver adatain közvetlenül műveleteket végezni.
Ezt végezhetjük az MS SQL Server 2000 adminisztrációs alkalmazásainak segítségével manuálisan, vagy programból egy tárolt eljárás segítségével. A mellékelt Employees.mdb adatbázis csatolásának mindkét módját bemutatjuk.
Első módszer, hogy a MS SQL Server Enterprise Manager segédprogramját használjuk, melyben grafikus eszközökkel adhatjuk az adatforrást a szerverhez.
Ekkor a Security - Linked Server pontot választva végezhetjük el a műveletet a felbukkanó panel megfelelő kitöltése után.
A másik módszer – amelyet alkalmazásunkban is használunk –, hogy a sp_addlinkedserver eljárás segítségével a program indulásakor adjuk az erőforrást a szerverhez abban az esetben, ha ez még nem történt meg. Ezt a MASTER adatbázis sysservers táblájában ellenőrizhetjük.

Az AddLinkedServer tárolt eljárásunk a következőképpen fest:
Create procedure AddLinkedServer(@path varchar(150))
as
  DECLARE @linkedsource varchar(150)
  SELECT @linkedsource= datasource FROM master.dbo.sysservers WHERE providername = 'Microsoft.Jet.OLEDB.4.0'
  if (@path != @linkedsource)
  begin
    exec sp_addlinkedserver @server = 'MSACCESS FILE(Employees.mdb)', @provider = 'Microsoft.Jet.OLEDB.4.0', @srvproduct = 'OLE DB Provider for Jet', @datasrc = @path
  end
GO
Amennyiben a szerver még nem tartalmazza a fenti állományt, akkor a beépített tárolt eljárás meghívásra kerül. Annak paraméterei a következők:
  • Első paramétere a kapcsolt szerver neve.
  • Második paramétere a csatoló neve.
  • Harmadik paraméterként feltüntetjük a csatoló objektum nevét, mely a regisztrált COM objektum neve is egyben.
  • A negyedik paraméter pedig az adatforrás elérési útvonalát tartalmazza.
Az alkalmazás indulásakor tehát paraméterezzük a tárolt eljárást és lefuttatjuk azt.
with DM do begin
  ADOCommand1.Parameters[1].Value := ExtractFilePath(Application.ExeName)+'Employees.mdb';
  ADOCommand1.Execute;
end;
A linkelt szerver adatainak eléréséhez az OPENROWSET beépített függvényt használhatjuk fel. A példában használható Employees.mdb állomány az MS SQL Server Northwind adatbázisának Employees táblaadatait tárolja egy MS ACCESS adathalmazban.
Az OPENROWSET metódusban azt a módszert választottuk, hogy megadtuk az erőforrás eléréséhez szükséges információkat, valamint az állományban megtalálható EmployeeTable objektum nevét, és a metódus meghívását egy SQL utasításba ágyaztuk.
Ebben az esetben az OPENROWSET metódus szintaxisa a következő:
OPENROWSET(<provider neve>,
           <állomány neve és elérési útvonala>;
           <azonosító>;<jelszó>,
           <adatforrás objektumának neve>)
A MŰVELET gombra kattintva lefuttatjuk azt az SQL parancsot, mely az OPENROWSET metódust tartalmazza a megfelelő paraméterekkel.
Az utasítás a következő:
str := 'SELECT a.FirstName +'' ''+ a.LastName FROM OPENROWSET(''Microsoft.Jet.OLEDB.4.0'',''' + ExtractFilePath(Application.ExeName) + 'Employees.mdb'';''admin'';'''',EmployeeTable) AS a WHERE EmployeeID = ' + comboBox1.Text;
Látható, hogy a FROM kulcsszó után elhelyezett függvényhívás-eredményhalmaz az EmployeeTable, melyre már elvégezhető a lekérdezés.
with DM do begin
  ADOCommand2.CommandText := str;
  rs := ADOCommand2.Execute;
end;
Az eredmény egy _Recordset típusú objektum, melyből kinyerjük a kiválasztott azonosítóhoz tartozó dolgozó nevét.
edit1.Text := rs.Get_Fields.Item[0].Get_Value;
Ez jelenik meg a szövegmezőben.