
A példaprogram használata előtt létre kell hozni egy SOUSER sémát az Oracle adatbázis-rendszerünkben, és fel kell ruházni DBA jogosultsággal. A sémába bejelentkezve le kell futtatni a mellékelt, az alkalmazás mappájának resources alkönyvtárában található Oracle.sql nevű parancsállományt a hivatkozott objektumok létrehozásához. Az említett névtér telepítéséhez olvassa el a Kezdeti beállítások című szakaszt.
Kezdeti beállítások
A Microsoft által elkészített névtér a System.Data.OracleClient nevet viseli, és cikkünk írásakor a következő Webcímen volt elérhető, mely természetesen megváltozhatott: http://msdn.microsoft.com/downloads/default.asp?url=/downloads/sample.asp?url=/msdn-files/027/001/940/msdncompositedoc.xml.
Letöltve az állományt (Oracle_net.msi) telepítenünk kell a .NET Framework alá. Az öntelepítő állomány erről gondoskodik, a használható .DLL állomány (System.Data.OracleClient.dll), és a kapcsolódó dokumentáció alapértelmezésben a következő mappába kerül: %winroot%:\Program Files\Microsoft.NET\OracleClient.Net\.
A telepített assembly bekerül a globális assembly-listába, így amikor referenciaként megadjuk alkalmazásainkban, akkor a globális palettáról kell kiválasztanunk, nem pedig valamilyen alternatív mappából.
A névtér referenciaként való hozzáadásához válasszuk tehát Project - Add reference menüpontot, majd a megjelenő ablakban a .NET lapon keressük elő a System.Data.OracleClient elemet.
Mellékelt alkalmazás
A mellékelt példában a SOUSER sémában lefuttatva az Oracle.sql parancsállományt a következő deklarációval rendelkező adattábla jön létre:
CREATE TABLE Table1
(ID NUMBER,
DATA BFILE NOT NULL,
EXTENSION VARCHAR(8));
A táblázat második oszlopában helyezzük majd el az állományokat.
A program indulásakor a MAPPA LÉTREHOZÁSA gombra kattintva létre kell hoznunk egy DIRECTORY objektumot, melyet egy megadott, a lokális fájlrendszerben létező mappára irányítunk. Ebben kell elhelyezni azokat az állományokat, melyeket a táblában szeretnénk rögzíteni. Ez alapértelmezésben a program mappájának RESOURCES almappája, mely természetesen javítható. Directory objektum létrehozása:
command.CommandText = "CREATE or REPLACE DIRECTORY MyDir as '" + pathText.Text + "\\'";
Az objektum létrehozása után a ’Fájlok tárolása adattáblában’ fül alatt kell megadnunk egy, a mappában elhelyezett állománynevet, melyet tárolni fogunk. A szerkesztőmezőben meg kell adni egy állománynevet elérési út nélkül, és megnyomni a MENTÉS gombot. Az állomány kiterjesztést külön eltároljuk, hogy olvasáskor tudjuk, milyen típusú állományt mentettünk az adott ID-vel rendelkező rekordba. A tárolás SQL utasítása a következő:
command.CommandText = "INSERT INTO Table1 VALUES(NULL, BFILENAME('MYDIR', '" + nameText.Text + "'),'" + fi.Extension.ToString() + "')";
Az ID oszlop értéke automatikusan kerül meghatározásra, melyről egy SEQUENCE és egy TRIGGER objektum kettősével gondoskodunk.
A BFILENAME beépített metódus segítségével megkaphatunk egy mutatót a BFILE típusú objektumra. A függvény első paramétere az a DIRECTORY objektum, melyet a program indulása után létrehozunk, a második paramétere a megadott állománynév.
Az állomány kiolvasásakor – ’Fájlok olvasása adattáblából’ fül - meg kel adnunk egy állománynevet elérési útvonallal, de kiterjesztés nélkül, amely állományba elmentjük a kiolvasott rekord értékét. Kiválasztva egy ID-t a ComboBox kontrolból és az OLVASÁS gombra kattintva megkaphatjuk az eredmény állományt.
A kódban megadjuk a SQL parancs szövegét:
command.CommandText = "SELECT * FROM Table1 WHERE ID = " + idCombo.Text;
Majd létrehozunk egy byte-tömböt a kiolvasott állomány tárolására:
Elvégezzük a műveletet, melynek eredményét egy OracleDataReader objektummal dolgozunk fel:
OracleDataReader reader = command.ExecuteReader();
using (reader)
{
if (reader.Read())
{
A rekord oszlopának értékét egy OracleBFile típusú objektumban tároljuk:
OracleBFile myBFile = reader.GetOracleBFile(1);
...
Betöltjük az OracleBFile objektum tartalmát a byte-tömbbe:
buffer = new byte[myBFile.Length];
using (myBFile)
{
myBFile.Seek(0, SeekOrigin.Begin);
myBFile.Read(buffer, 0, (int)buffer.Length);
}
}
}
...
Majd kiírjuk egy FileStream objektum segítségével a merevlemezre:
FileStream fs = new FileStream(newText.Text + ext,FileMode.Create,FileAccess.Write);
fs.Write(buffer, 0, (int)buffer.Length);