3

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.

2 Answers 2

3

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())
        // ...
    }
}
Sign up to request clarification or add additional context in comments.

Comments

2

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.

2 Comments

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

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.