Click here to Skip to main content
15,889,403 members
Articles / Desktop Programming / Windows Forms
Article

Embedded Firebird: Full-Featured Embedded Database with 2 MB Runtime

Rate me:
Please Sign up or sign in to vote.
4.77/5 (60 votes)
28 Jan 20052 min read 528.7K   15.2K   194   116
An example that shows how Firebird database excels in embedding.

Sample Image - screenshot.gif

The advantages of Embedded Firebird

Firebird is a database with 20 years of history, full set of features (including transactions, stored procedures, hot-backup, excellent scalability, etc.) and a friendly open source license. It is an overlooked but compelling alternative to Microsoft Jet and Microsoft MSDE 2000/SQL Express 2005. Let's take a look at how it can be used embedded in your desktop application. What makes Embedded Firebird ideal for embedding:

  • The embedded runtime is < 2 MB (starting at just one DLL + one .NET assembly). The runtime is deployed by simple copying, no installation or component registration is required.
  • The database file (it's just a single file) can have any name and extension. You can associate the extension with your application.
  • The migration to a standalone server couldn't be easier. Just copy the database file to the server and change a connection string on your client.

Working with Embedded Firebird

To start using Embedded Firebird in .NET, you need to download:

  • Embedded Firebird Engine (current stable version is 1.5.2)
  • Firebird ADO.NET Provider (current stable version is 1.6.3)

After creating a new project in Visual Studio .NET, add a reference to FirebirdSql.Data.Firebird.dll (from Firebird ADO.NET Provider installation), and copy fbembed.dll (from Embedded Firebird ZIP package) to the project output directory (e.g., bin/Debug).

The Firebird ADO.NET Provider can connect to a standalone Firebird Server using a connection string like this:

C#
FbConnection c = new FbConnection("ServerType=0;User=SYSDBA;" + 
         "Password=masterkey;Dialect=3;Database=c:\\data\\mydb.fdb");

It can connect to an embedded Firebird using this connection string:

C#
FbConnection c = new FbConnection("ServerType=1;User=SYSDBA;" + 
                 "Password=masterkey;Dialect=3;Database=mydb.fdb");

The database path can be relative to fbembed.dll when using the Embedded Firebird.

You see that switching from embedded and standalone Firebird and vice versa is a piece of cake.

Creating a new database

There are two ways to create a new database:

  • Creating a database programmatically.
  • Copying an existing database template.

It's up to you which way you choose. Copying an existing database is easy (just make sure the template is not open before copying), so let's try to create it programmatically.

C#
Hashtable parameters = new Hashtable();
parameters.Add("User", "SYSDBA");
parameters.Add("Password", "masterkey");
parameters.Add("Database", @"mydb.fdb");
parameters.Add("ServerType", 1);
FbConnection.CreateDatabase(parameters);

Continue as usual

Working with Firebird ADO.NET Provider is easy. You will reuse your experience with other ADO.NET providers. It even has some nice features, like calling the stored procedures using the MSSQL style:

C#
FbCommand cmd = new FbCommand("MYSTOREDPROCEDURE", 
            new FbConnection(connectionString));
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add("@first", "value1");
cmd.Parameters.Add("@second", "value2");
cmd.Connection.Open();
try
{
    cmd.ExecuteNonQuery();
}
finally
{
    cmd.Connection.Close();
}

Useful Resources

License

This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here


Written By
Czech Republic Czech Republic
My open-source event calendar/scheduling web UI components:

DayPilot for JavaScript, Angular, React and Vue

Comments and Discussions

 
QuestionThe Embedded Firebird in .NET is no longer available Pin
henryagami15-Aug-16 20:44
henryagami15-Aug-16 20:44 
QuestionThe Embedded Firebird in .NET is no longer available Pin
henryagami15-Aug-16 21:31
henryagami15-Aug-16 21:31 
Questionconnection to an asp.net erp Pin
ezekielokeyo18-Jul-12 19:08
ezekielokeyo18-Jul-12 19:08 
QuestionFor those of you who're interested to get it setup on 64 bit platform (plus create db/table/insert rows) Pin
devvvy14-May-12 2:05
devvvy14-May-12 2:05 
Tutorial - Get it working with 64 bit Winform

REF:
Brief tutorial: http://www.codeproject.com/Articles/9445/Embedded-Firebird-Full-Featured-Embedded-Database
Embedded Firebird: http://www.firebirdsql.org/en/firebird-2-5-1/#Win64
Firebird provider src: http://www.firebirdsql.org/en/net-provider/
Firebird doc: http://www.firebirdsql.org/en/documentation/
Firebird Language reference: http://www.firebirdsql.org/file/documentation/reference_manuals/reference_material/html/langrefupd25.html
Firebird DataType (Compare to M$SQL): http://www.firebirdsql.org/manual/migration-mssql-data-types.html
Firebird Language Reference - CREATE TABLE: http://www.firebirdsql.org/refdocs/langrefupd15-create-table.html

STEP 1. Download Firebird embedded dll's - in this example, "Firebird-2.5.1.26351-0_x64_embed" from \Download\Firebird 2.5\Win64\64-bit Embedded
http://www.firebirdsql.org/en/firebird-2-5-1/#Win64
Extract the package. You'd later need to copy "fbembed.dll" and other dll's into your application root directory.

STEP 2. Download .NET Provider
In this example, NETProvider-2.7.5-src. Extract the package and compile with [target=x64] from Visual Studio
http://www.firebirdsql.org/en/net-provider/

Your "Provider" can be found here:
...\ClientProviderSrc\source\FirebirdSql\Data\bin\Debug\FirebirdSql.Data.FirebirdClient.dll

STEP 3. Create a dummy .NET Winform project,

STEP 3.1 add reference to your Firebird provider:
...\ClientProviderSrc\source\FirebirdSql\Data\bin\Debug\FirebirdSql.Data.FirebirdClient.dll

Also, put all dll's from Firebird-2.5.1.26351-0_x64_embed package (STEP 1) under application root.

STEP 3.2 From Form1.cs,
using FirebirdSql.Data.FirebirdClient;

STEP 3.3 Add a button, try out basic moves ...

string connectionString = "ServerType=1;User=SYSDBA;Password=masterkey;Dialect=3;Database=";

// REF: http://www.codeproject.com/Articles/9445/Embedded-Firebird-Full-Featured-Embedded-Database?msg=4252054#xx4252054xx
<br />
			private void button1_Click(object sender, System.EventArgs e)<br />
			{<br />
				string DbFilePath = @"C:\...\EmbeddedDB\Firebird\Sample\EmbeddedFirebirdExample\bin\x64\Debug\TestingDatabase.FDB";<br />
				string FullConnString = this.connectionString + DbFilePath;<br />
<br />
				// STEP 1. Create (or Re-create) database and database file <br />
				if (!System.IO.File.Exists(DbFilePath))<br />
				{<br />
					FbConnection.CreateDatabase(FullConnString);<br />
				}<br />
				<br />
<br />
				FbConnection conn = new FbConnection(FullConnString);<br />
				conn.Open();<br />
<br />
				// STEP 2. Change default SYSDBA pwd? No!<br />
				// This will not work on embedded Firebird!<br />
				/*<br />
				string AlterPwdCmdSQL = "alter user SYSDBA password 'xyzabc123'";<br />
				FbCommand AlterPwdCmd = conn.CreateCommand();<br />
				AlterPwdCmd.CommandText = AlterPwdCmdSQL;<br />
				AlterPwdCmd.ExecuteNonQuery();<br />
				*/<br />
<br />
				// STEP 3. Create a table<br />
				// NOTE: Can only do this once! <br />
				// REF 1: http://web.firebirdsql.org/dotnetfirebird/blog/2005/01/creating-database-programmatically.html<br />
				// REF 2: http://www.firebirdfaq.org/faq69/<br />
				// STEP 3.1 Check if table exists - CAUTION: Table name upper case!!!<br />
				string SimpleCheckIfTableExists = "select count(1) from rdb$relations where rdb$relation_name = 'EIK'";<br />
				FbCommand CheckTableExistCmd = conn.CreateCommand();<br />
				CheckTableExistCmd.CommandText = SimpleCheckIfTableExists;<br />
				int CountTable = (int)CheckTableExistCmd.ExecuteScalar();<br />
				if (CountTable > 0)<br />
				{<br />
					// Drop table<br />
					string SimpleDropTableIfExists = "drop table EIK;";<br />
					FbCommand DropTableCmd = conn.CreateCommand();<br />
					DropTableCmd.CommandText = SimpleDropTableIfExists;<br />
					DropTableCmd.ExecuteNonQuery();<br />
				}<br />
<br />
				// STEP 3.2 Re-create the table<br />
				// CAUTION: <br />
				// (a) "Timestamp" is a reserved keyword for Firebird.<br />
				// (b) Table name "eik" -- Actual created table name = "EIK" <br />
				string SimpleCreateTableSQL = "create table eik (a int not null primary key, b int not null unique, c timestamp default current_timestamp);";<br />
				FbCommand CreateTableCmd = conn.CreateCommand();<br />
				CreateTableCmd.CommandText = SimpleCreateTableSQL;            <br />
				CreateTableCmd.ExecuteNonQuery();<br />
				<br />
				// STEP 4. Insert row<br />
				// NOTE: Can only do this once! (PK constraint!)<br />
				string SimpleInsertSQL = "insert into eik (a,b) values (123,456);";<br />
				FbCommand InsertRowCmd = conn.CreateCommand();<br />
				InsertRowCmd.CommandText = SimpleInsertSQL;<br />
				InsertRowCmd.ExecuteNonQuery();<br />
				<br />
				// STEP 5. A simple select<br />
				FbDataAdapter da = new FbDataAdapter("SELECT * FROM eik", FullConnString);<br />
				// FbDataAdapter da = new FbDataAdapter("SELECT * FROM table1", this.connectionString + this.textBox1.Text);<br />
				DataTable dt = new DataTable();<br />
				da.Fill(dt);<br />
				this.dataGrid1.DataSource = dt;<br />
			}<br />


STEP 4. Bulk Insert?
With SQL Server,
<br />
					DataRow[] RowsImported = LoadFromSomeDataTable(MyData);<br />
					bc = new System.Data.SqlClient.SqlBulkCopy(Conn);<br />
                    bc.BulkCopyTimeout = 60 * 60;<br />
                    bc.DestinationTableName = SomeName;<br />
                    bc.WriteToServer(RowsImported);<br />


With Firebird, you have to make do with external table, quoting - http://www.firebirdfaq.org/faq209/
<br />
			CREATE TABLE ext1 EXTERNAL 'c:\myfile.txt'<br />
			(<br />
				field1 char(20),<br />
				field2 smallint<br />
			);<br />


To do quick import into regular table, do something like this:
<br />
				INSERT INTO realtable1 (field1, field2)<br />
				SELECT field1, field2 FROM ext1;<br />


This insert would still check constraints, foreign keys, fire triggers and build indexes. If you can, it is wise to deactivate indexes and triggers while loading and activate them when done.

STEP 5. You can't change SYSDBA pwd for embedded Firebird - in fact there's no need to do so. The following won't work!
<br />
				string DbFilePath = @"D:\...\SampleData.FDB";<br />
				string FullConnString = this.connectionString + DbFilePath;<br />
				FbConnection conn = new FbConnection(FullConnString);<br />
				conn.Open();<br />
				 <br />
				string AlterPwdCmdSQL = "alter user SYSDBA password 'xyzabc123'";<br />
				FbCommand AlterPwdCmd = conn.CreateCommand();<br />
				AlterPwdCmd.CommandText = AlterPwdCmdSQL;<br />
				AlterPwdCmd.ExecuteNonQuery();<br />


Upon ExecuteNonQuery -
<br />
				+ ex {"unsuccessful metadata update\r\nI/O error during \"CreateFile (open)\" operation for file \"C:\\...\\EMBEDDEDFIREBIRDEXAMPLE\\BIN\\X64\\DEBUG\\SECURITY2.FDB\"\r\nError while trying to open file"} FirebirdSql.Data.Common.IscException<br />

Seems like I'm not the first person running into this problem:
http://tech.groups.yahoo.com/group/firebird-support/message/83729

Now, quoting here http://www.firebirdsql.org/manual/ufb-cs-embedded.html
<br />
				The Windows Embedded Server is a Superserver engine plus client rolled into one library, called fbembed.dll. It is available as a separate download package. The embedded server (introduced with Firebird 1.5) was specifically designed to facilitate deployment of applications that ship with a Firebird server included. Installation is just a matter of unpacking the DLL and a few other files to the desired location. The security database is not used at all: anyone can connect to any database, as long as the user running the application has filesystem-level access rights to the database(s) in question... The embedded server has no facility to accept any network connections. Only true local access is possible, with a connect string that doesn't contain a host name (not even localhost).<br />

So, there's nothing you can do to secure an embedded Firebird - you can only secure the Windows machine/OS on which the Firebird db resides.

STEP 6. DbProviderFactories.GetFactory will fail unless you reference the dll from app.config!

DbProviderFactories.GetFactory("FirebirdSql.Data.FirebirdClient");      <-- This will blow up!<br />


To do this,
STEP 6.1 - determine public key token

			<br />
					D:\...\Firebird\ClientProviderSrc\source\FirebirdSql\Data\bin\Debug>gacutil /i FirebirdSql.Data.FirebirdClient.dll<br />
						Microsoft (R) .NET Global Assembly Cache Utility.  Version 4.0.30319.1<br />
						Copyright (c) Microsoft Corporation.  All rights reserved.<br />
						Assembly successfully added to the cache<br />
<br />
				Now, /u will tell you public key of the dll!<br />
				<br />
					D:\...Firebird\ClientProviderSrc\source\FirebirdSql\Data\bin\Debug>gacutil /u FirebirdSql.Data.FirebirdClient<br />
						Microsoft (R) .NET Global Assembly Cache Utility.  Version 4.0.30319.1<br />
						Copyright (c) Microsoft Corporation.  All rights reserved.<br />
						<br />
					D:\...\Firebird\ClientProviderSrc\source\FirebirdSql\Data\bin\x64\Debug>gacutil /u FirebirdSql.Data.FirebirdClient<br />
					Assembly: FirebirdSql.Data.FirebirdClient, Version=2.7.5.0, Culture=neutral, PublicKeyToken=3750abcc3150b00c, processorArchitecture=AMD64<br />
					Uninstalled: FirebirdSql.Data.FirebirdClient, Version=2.7.5.0, Culture=neutral,<br />
					PublicKeyToken=3750abcc3150b00c, processorArchitecture=AMD64<br />
					Number of assemblies uninstalled = 1<br />
					Number of failures = 0<br />


STEP 6.2
<br />
				<?xml version="1.0"?><br />
				<configuration><br />
				  <configSections><br />
					... other stuff ...<br />
				  </configSections><br />
<br />
				  <system.data><br />
					<DbProviderFactories><br />
					  <!-- rao: Firebird driver; prefer locally placed driver (any version)--><br />
					  <remove invariant="FirebirdSql.Data.FirebirdClient" /><br />
					  <add name="FirebirdSql.Data.FirebirdClient" invariant="FirebirdSql.Data.FirebirdClient" description="Firebird Data Provider for .NET" type="FirebirdSql.Data.FirebirdClient.FirebirdClientFactory, FirebirdSql.Data.FirebirdClient, Culture=neutral, PublicKeyToken=3750abcc3150b00c" /><br />
					</DbProviderFactories><br />
				  </system.data><br />
					... other stuff ...<br />
				</configuration><br />


REF: http://programming.2be-it.com/?p=160
dev


modified 16-May-12 4:16am.

AnswerRe: For those of you who're interested to get it setup on 64 bit platform (plus create db/table/insert rows) Pin
Dave Simon9-Feb-21 11:43
Dave Simon9-Feb-21 11:43 
Generalembedded firebird with c#.net(3.5) and vs2008 Pin
saurabh.patil@hotmail.com19-May-10 22:12
saurabh.patil@hotmail.com19-May-10 22:12 
QuestionHow Maintain Firebird Embedded Connection Open!?!?! Pin
Rafael Fernandes Brasil25-Aug-09 4:07
Rafael Fernandes Brasil25-Aug-09 4:07 
QuestionStill Supported? Pin
Jawz-X8-Sep-08 10:24
Jawz-X8-Sep-08 10:24 
AnswerRe: Still Supported? Pin
Dr.Serdar12-Sep-08 12:35
Dr.Serdar12-Sep-08 12:35 
GeneralRe: Still Supported? Pin
Jawz-X16-Sep-08 8:22
Jawz-X16-Sep-08 8:22 
Generaldoesn't work for firebird 2 Pin
ujal17-Aug-08 21:10
ujal17-Aug-08 21:10 
QuestionProblems with Stored Procedures with Embedded Firebird 2.0 Pin
dsovino17-Jan-08 7:13
dsovino17-Jan-08 7:13 
QuestionHelp Pin
K_Farhod17-Sep-07 22:46
K_Farhod17-Sep-07 22:46 
AnswerRe: Help Pin
_CloudyOne_5-Jun-08 14:01
_CloudyOne_5-Jun-08 14:01 
QuestionDLL Not Found Pin
jet858-May-07 7:31
jet858-May-07 7:31 
AnswerRe: DLL Not Found Pin
tcdavis9-May-07 6:06
tcdavis9-May-07 6:06 
GeneralRe: DLL Not Found Pin
jet8510-May-07 9:04
jet8510-May-07 9:04 
GeneralRe: DLL Not Found Pin
tcdavis10-May-07 9:14
tcdavis10-May-07 9:14 
GeneralRe: DLL Not Found Pin
balazs_hideghety16-Jul-07 3:41
balazs_hideghety16-Jul-07 3:41 
GeneralRe: DLL Not Found Pin
DaberElay31-Jan-09 10:55
DaberElay31-Jan-09 10:55 
Generalnot managed Pin
Andrew Shapira4-Feb-07 3:11
Andrew Shapira4-Feb-07 3:11 
QuestionChange the password? Pin
BJ Basañes15-Jan-07 15:39
BJ Basañes15-Jan-07 15:39 
AnswerRe: Change the password? Pin
Zoltan Balazs16-Jan-07 21:27
Zoltan Balazs16-Jan-07 21:27 
GeneralRe: Change the password? Pin
transoft8-Sep-09 9:02
transoft8-Sep-09 9:02 
GeneralRe: Change the password? Pin
Trinh Tuan4-Sep-10 16:30
Trinh Tuan4-Sep-10 16:30 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.