Před asi tak deseti lety jsem programoval jedno databázové řešení, které bylo založené na VB6 (znalci si jistě vzpomenou) a na Accessu. Z původně malé, embedded databáze se během vývoje vyklubalo něco, co mělo zvládat práci zhruba pěti, šesti uživatelů současně a databáze v některých tabulkách měla mít několik desítek tisíc řádků. Samozřejmě, že to v reále nefungovalo, na něco takového Access nebyl stavěný. Databáze padala jak švestky na podzim, projekt byl přepsán do MSSQL a já si zapsal za uši, že embedded databáze je sprostý výraz, který se v mojí přítomnosti nesmí vyslovovat.
Před nedávnem jsem opět dostal zakázku na řešení vyžadující vloženou databázi. Již delší dobu pošilhávám po tom, že vyzkouším Firebird, nuže vyzkoušel jsem, a tady jsou moje postřehy.
Instalace a zprovoznění
Nebudu dopodrobna popisovat, co je třeba udělat, pokud chcete k .NETovému projektu přibalit knihovny potřebné pro běh embedded verze Firebirdu, to už za mě udělali jiní. V zásadě jde o to přibalit k projektu jednak knihovny samotného firebirdu, a jednak knihovny ADO.NET data providera. Je ale fakt, že to skutečně funguje. Pokud někdo, stejně jako já, používá pro instalaci vynikající InnoSetup, postačí do skriptu dopsat něco ve smyslu:
Source: fbclient.dll; DestDir: {app}
Source: icudt30.dll; DestDir: {app}
Source: icuin30.dll; DestDir: {app}
Source: icuuc30.dll; DestDir: {app}
Source: intl\fbintl.conf; DestDir: {app}\intl
Source: intl\fbintl.dll; DestDir: {app}\intl
Source: FirebirdSql.Data.FirebirdClient.dll; DestDir: {app}
Firebird má 32bitové i 64bitové verze, takže nepoplést. Dále je třeba v projektu mít nějakou tu databázi. Ta se dá buď přibalit vytvořená, nebo vytvořit pomocí příkazu:
FbConnection.CreateDatabase(connectionString)
A pokud potřebujete ze skriptu vygenerovat nějaké databázové objekty, tak Vám poslouží objekt FBScript
Dim sc As FbScript = New FbScript(Obsah)
sc.Parse()
Dim fbe As FbBatchExecution = New FbBatchExecution(conn)
For Each xcmd As String In sc.Results
fbe.SqlStatements.Add(xcmd)
Next
fbe.Execute()
Co Firebird umí
Asi by bylo jednodušší popsat, co neumí, ale nic mě nenapadá. Má pohledy, uložené procedury, spouště, cizí klíče, generátory … prostě všechno, co si budete přát. Navíc, embedded verze není nijak okleštěná oproti “velkému” Firebirdu. A killer feature – pokud se Vám projekt rozroste, prostě vyměníte connectionstring a namísto “malé” databáze použijete databázový server. V aplikaci jinak není třeba upravovat nic.
Reálný provoz
Co mě ale dostalo, je absolutní pohoda při práci s tímto řešením. Vytvořil jsem zátěžové testy, naspal jsem do embedded databáze desítky megabajtů dat a ono to stále fungovalo. Fungovalo to všude od Windows 98 po Windows seven, a celkem konzistentní byl i výkon. Jediná věc, na kterou jsem narazil byla ta, že opakované select dotazy je z hlediska výkonu lepší přepsat do uložených procedur. Ale to platí pro jakoukoli databázi.
Z nějakého důvodu jsem potřeboval pracovat s BLOBy, rovněž naprostá pohoda. Existuje dokonce názor, že práce s Firebirdem je v tomto ohledu výkonnější než práce s filesystémem. Nevím, nezkoušel jsem.
Co mě štve
Abych jen nepěl chválu – existují i nějaké maličkosti, na které při práci s Firebirdem narazíte. Já řešil třeba tohle:
- Internetové stránky http://www.firebirdsql.org/ vypadají jak z roku 1999.
- DDL je místy zkostnatělý a tvrdohlavý.
alter table texty add popis varchar (200) not null default '';
neprojde, ale
alter table texty add popis varchar (200) default '' not null;
projde. Jde o zvyk.
- Občas musíte hledat dokumentaci. Tak třeba z VB.NET získat hodnotu výstupního parametru z uložené procedury se mi podařilo až metodou pokus-omyl. Za to samozřejmě nemůžou ani tak vývojáři firebirdu, jako spíš vývojáři ADo.NET pro firebird.
- Nevím, co použít na správu databáze. Zkouším IBExpert, ale management studio to není ;-) . Nevíte někdo o něčem lepším?