views:

191

answers:

2

How can I execute a DDL statement via NHibernate?

To be clear, I don't want to auto-generate my schema from my mapping files. My DDL is stored in plain text files along the lines of:

CREATE TABLE Foo (Bar VARCHAR(10))
GO
CREATE TABLE Hello (World INTEGER)
GO

I want to cycle through these in order and execute each of them. I could just open a SqlConnection and execute via a SqlCommand but I'd like to go through NHibernate if there is a nice way to do this. This is mainly because I want to remain as database agnostic as possible: I have a SQL db now but I might need to implement Oracle or DB2 later...

I'm using .Net v3.51 and NHibernate v2.1. I looked at the NHibernate SchemaExport class but couldn't see a way to use this for this purpose.

+1  A: 

You can get an IDbConnection from an ISession's Connection property but you'll need to do this with SqlCommand. Executing DDL is outside of NHibernate's scope.

Jamie Ide
I want to make this database agnostic - is there a straightforward way of doing this e.g. will Nhibernate give me an IDbCommand?
Steve
Calling IDbConnection.CreateCommand returns an IDbCommand. But I don't think you can achieve database agnostic DDL except for simple cases.
Jamie Ide
+2  A: 

I've used session.Connection.CreateCommand and session.Transaction.EnlistCommand before with success to run raw SQL.

Here's a snippet of something similar that I've done:

using (var command = _session.Connection.CreateCommand())
{
    _session.Transaction.Enlist(command);
    command.CommandText = "select foo from bar where id = @id";
    var versionIdParameter = command.CreateParameter();
    versionIdParameter.ParameterName = "id";
    versionIdParameter.Value = id;
    command.Parameters.Add(versionIdParameter);
    using(var reader = command.ExecuteReader(CommandBehavior.SequentialAccess))
    {
        while (reader.Read())
        // ...
    }
}
David Hogue