Wednesday, November 02, 2005

Run an embedded SQL Script against Firebird

I had an idea that it would be great if my application could automatically create any database that it required.

I have in the past attempted to hardcode database construction routines but dislike this approach as it makes the code messy and difficult to maintain. Instead, I favoured the idea of executing a script containing my SQL statements which could be used to construct the database. The application would just simply execute the script, an approach I’ve used in the past with SQL Sever.

Whilst investigating further, I found these useful links:

Using FbConnectionStringBuilder
Batch SQL/DDL Execution

However, distributing a separate script file would allow a user to change or view the contents of the file.

Having experimented with embedded resource files, I thought a similar approach would protect the script from abuse by the average user and only venerable to experienced programmers.

I tested various routines and arrived at the following working example:

void ButtonRunScriptClick(object sender, System.EventArgs e)
{
//specify the database name
string dbName = "test.fdb";
//instanciate a new connection stringbuilder
FbConnectionStringBuilder csb = new FbConnectionStringBuilder();
csb.Database = dbName;
csb.UserID = "SYSDBA";
csb.Password = "masterkey";
csb.ServerType = 1;         //embedded server
//instanciate a connection object
FbConnection con = new FbConnection(csb.ToString());
//check if the database exists
if (System.IO.File.Exists(dbName) == false)
//create the database as it didn’t exist
FbConnection.CreateDatabase(csb.ToString());
//run the script against the current connection
RunScript("Test.Sql", con);
}

void RunScript(string ScriptName, FbConnection connection)
{
//get a reference to the executing assembly
System.Reflection.Assembly assembly = System.Reflection.Assembly.GetExecutingAssembly();
//instanciate a textReader object initialised using a stream to the embedded resource
System.IO.TextReader textReader = new System.IO.StreamReader(assembly.GetManifestResourceStream(ScriptName));
FbScript script = new FbScript(textReader);
//parse the script
script.Parse();
//open the connection
connection.Open();
FbBatchExecution fbe = new FbBatchExecution(connection);
foreach (string cmd in script.Results)
{
//add each sql statement to the batch
fbe.SqlStatements.Add(cmd);
}
//execute the batch
fbe.Execute();
//close the connection
connection.Close();
}

To test the above code, you will need to do the following:
1)     Download and install the 'Firebird ADO.Net Provider' from DotNetFirebird
2)     Once installed, create a new Windows Application and add a reference to your project for the FirebirdSql.Data.Firebird assebly loaded in the GAC.
3)     Copy & Paste the sample code into your project.
4)     Add the following Using Directives:

using FirebirdSql.Data.Firebird;
using FirebirdSql.Data.Firebird.Isql;

5)     Download 'Embedded Firebird for Windows' from DotNetFirebird and extract ‘fbembed.dll’ and ‘firebird.msg’ from the zip archive. These files should be copied to your applications directory.
6)     Create a text file named 'Test.Sql' to contain your Firebird SQL script and save it in your project directory. I would suggest including a CREATE TABLE statement such as:

CREATE TABLE CLIENTS (
client_id integer not null,
firstname char(20),
lastname char(20),
PRIMARY KEY (client_id));

Note: The filename is case sensitive, if you choose a different filename you will need to amend the sample code to reflect this change.

7)     Add the file you created in Step 4 to your project and set the build action to Embedded Resource.
8)     Add a button to your form named buttonRunScript and check that its Click Event is set to the ButtonRunScriptClick Event Handler.

Hopefully, when you build the project and click the Run Script button, a file will be created in the applications directory named ‘TEST.FDB’.

Providing there were no errors during the applications execution the database should have been constructed according to the statements in the SQL script.

There are several Database Admin Tools you can use to inspect/update and alter the database, one of which is FlameRobin which can also be downloaded for free.    

1 comment:

Anonymous said...

thanx for this helpfull topic.