Každý to zná. Databáze jsou velký pomocník. Transakce vyřeší mnoho problémů a constrainty zase udrží data resp. uživatele v těch správných mezích. Jenže když člověk píše jednoúčelovou aplikaci, která má být „dej na flashku a používej, jak chceš“ je s databázemi trochu problém.
Každý to zná. Databáze jsou velký pomocník. Transakce vyřeší mnoho problémů a constrainty zase udrží data resp. uživatele v těch správných mezích. Jenže když člověk píše jednoúčelovou aplikaci, která má být „dej na flashku a používej, jak chceš“ je s databázemi trochu problém. Můžete mít nainstalován server kdesi v internetu a na něm mít databáze – jenže musíte obhospodařovat server jako takový, databáze na něm; no prostě moc práce, nehledě na to, že když uživatel vaší aplikace bude bez připojení k internetu, moc toho neudělá (ano je to řešitelné, ale …). Na druhou stranu můžete jednoduchou, nejlépe bezobslužnou, instalaci serveru přihodit k aplikaci – nicméně uživatel musí mít práva instalovat software, aplikaci nemůže lehce přenášet a nemůže ji používat bez problémů ani na dvou místech.
Ačkoli nainstalovaný server přináší mnoho výhod od výkonu přes jednotnou politiku zálohování a bezpečnosti až po možnost práce mnoha uživatelů společně, embedded databáze stále nevymřely. Na internetu lze nalézt mnoho implementací, s různými vlastnostmi a s různým stupněm kvality. My se dnes podíváme na jednu z nich – Firebird Embedded. Proč zrovna Firebird? Předně Firebird Embedded existuje jak ve formě serveru, tak i jako embedded. A přechod mezi nimi není vůbec obtížný. Změníte jen jeden parametr v connection stringu a je hotovo. Nemusíte ani překompilovávat aplikaci. Vše ostatní funguje stejně. Embedded verze umí vše co server, nejde tedy o nějaký degradovaný extrakt. Kdo se chce dozvědět více o Firebirdu obecně, může využít odkazů pod článkem [1], [2].
Co všechno tedy budeme potřebovat? Samozřejmě samotný Firebird Embedded. Ke stažení na http://www.firebirdsql.org/index.php?op=files&id=engine, aktuální verze (v době psaní článku) je 2.0.3. Protože se pohybujeme na .NET palubě, bude to chtít i nějaký provider. ODBC aspol. rovnou zamítneme a raději si stáhneme nativní provider. Firebird ADO.NET Data Provider je dispozici pro .NET Framework 1.1, 2.0, Compact Framework 2.0, Mono 1.1.18+, vše „roste“ na http://www.firebirdsql.org/index.php?op=files&id=netprovider. Existuje i DDEX provider pro Visual Studio, nicméně jeho použití není předmětem tohoto článku. Pro zájemce doporučuji článek [3] event. [4].
ADO.NET provider je jen jedno assembly, které stačí přidat k projektu a začít využívat odpovídající namespaces. Vlastní embedded server je několik souborů, které stačí přihodit k distribuci aplikace. Nezbytně budete potřebovat fbembed.dll, icudt30.dll, icuin30.dll, icuuc30.dll. Vhodné je přidat i intl\fbintl.conf, intl\fbintl.dll, pro podporu všech znakových sad. Na některých systémech resp. konfiguracích nemusí být k dispozici knihovny msvcp71.dll a msvcr71.dll, tyto najdete také v balíku a v případě nutnosti je distribuujte společně s aplikací. Strukturu adresářů je třeba zachovat tak jako v archivu. Obecně je třeba fbembed.dll umístit na místo, kde systém implicitně hledá DLL knihovny. Pokud vám toto nevyhovuje, je možné v provideru specifikovat, odkud má být knihovna načítána.
Jakmile máme vše připraveno, můžeme se pustit do tvorby naší první aplikace s databází „zapečené“ přímo s aplikací. Předpokládám, že máte minimální zkušenosti s ADO.NET a nebudu se tedy zabývat detaily. Nareferencujte do projektu FirebirdSql.Data.FirebirdClient assembly a přidejte stejnojmenný namespace. V této chvíli už vám nebrání nic vytvářet si spojení a příkazy jak je libo. Jako jednoduchý příklad je možné použít:
1: using (FbConnection conn = new FbConnection(@"initial catalog=C:\NejakaDatabaze.fdb;user id=SYSDBA;password=masterkey;ServerType=1;ClientLibrary=C:\Aplikace\fbembed.dll"))
2: {
3: conn.Open();
4: using (FbCommand cmd = conn.CreateCommand())
5: {
6: cmd.CommandText = "select id, neco from tabulka";
7: using (FbDataReader reader = cmd.ExecuteReader())
8: {
9: while (reader.Read())
10: {
11: Console.WriteLine("ID: {0} \t Name: {1}", reader[0], reader[1]);
12: }
13: }
14: }
15: }
|
Pozorného čtenáře jistě napadlo, jak se můžeme připojit k DB, když ještě žádnou nemáme. Inu řešení je velmi jednoduché. Objekt FbConnection má statickou metodu CreateDatabase. Vytvoření DB již také není problém.
Doposud jsme se zabývali tak trochu mimoděk aplikacemi v klasickém – desktopovém – pojetí. Nicméně ani ASP.NET není s Firebirdem Embedded problém. Asi nikoho nepřekvapí, že vlastní .NET kód zůstává stejný. Nemění se vlastně vůbec nic. Jediné co je třeba zajistit je, aby ASP.NET aplikace mělo právo přistoupit k fbembed.dll. Nic magického. A přidat si lehce databázi k ASP.NET aplikaci není zas tak špatná výzva, že?
Abychom ale neskončili tak rychle, určitě vás napadalo, jaké má FB Embedded neřesti a problémy, neboť všude je nějaký háček. V zásadě nepřijde žádný podraz. Fungují transakce, fungují cizí klíče, fungují uložené procedury. Stejně jako na serveru. Prostě vše co od databáze můžete potřebovat. Avšak knihovna fbembed.dll není aktuálně k dispozici v 64-bit verzi. Znamená to, že musíte aplikaci označit – ve vlastnostech projektu – jako 32-bit (x86), jinak se totiž nepovede knihovnu zavést. Další problém je exkluzivní zamykání databázového souboru. U běžných desktopových aplikací to tolik nevadí, ale u ASP.NET může. Je tedy nutné, v případě ASP.NET, zajistit, aby přístup k souboru byl pouze z jednoho procesu. A nakonec poslední; je třeba přidat uživatelům právo „Create Global Objects“ (standardně jen Administrators) od WinXP SP2 a vyšší.
Co potřebujete více? Nic. Tato minimalistická konfigurace se vejde i na nejmenší flashku, kterou dnes objevíte. Nezbývá než mít geniální nápad, proměnit jej v aplikaci a tu v pohádkové množství peněz.