Question

I am using Devart Postgres driver as the Ado.net provider with NHibernate. Since NHibernate does not support Devart Postgres driver, I wrote a custom driver class based on ReflectionBasedDriver. Here is the code:

namespace PostgresDriver.DbDriver
{
    class DevartPgDriver : ReflectionBasedDriver
    {
        public DevartPgDriver()
            : base(
            "Devart.Data.PostgreSql",
            "Devart.Data.PostgreSql.PgSqlConnection",
            "Devart.Data.PostgreSql.PgSqlCommand")
        {
        }

        public override string NamedPrefix
        {
            get { return ":"; }
        }

        public override bool UseNamedPrefixInParameter
        {
            get { return true; }
        }

        public override bool UseNamedPrefixInSql
        {
            get { return true; }
        }

        public override bool SupportsMultipleOpenReaders
        {
            get { return false; }
        }

        protected override bool SupportsPreparingCommands
        {
            get { return true; }
        }

        public override IResultSetsCommand GetResultSetsCommand(NHibernate.Engine.ISessionImplementor session)
        {
            return new BasicResultSetsCommand(session);
        }

        public override bool SupportsMultipleQueries
        {
            get { return true; }
        }

        protected override void InitializeParameter(IDbDataParameter dbParam, string name, NHibernate.SqlTypes.SqlType sqlType)
        {
            base.InitializeParameter(dbParam, name, sqlType);

            // Since the .NET currency type has 4 decimal places, we use a decimal type in PostgreSQL instead of its native 2 decimal currency type.
            if (sqlType.DbType == DbType.Currency)
                dbParam.DbType = DbType.Decimal;
        }
    }
}

I have added Devart.Data and Devart.Data.PostgreSql DLLs as references in my solution and set 'Copy Local' property to True. I have also added the following section in App.Config:

  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <qualifyAssembly partialName="Devart.Data.PostgreSql"
            fullName="Devart.Data.PostgreSql, Version=7.2.80.0, Culture=neutral, PublicKeyToken=09af7300eec23701">
      </qualifyAssembly>
    </assemblyBinding>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <qualifyAssembly partialName="Devart.Data"
            fullName="Devart.Data, Version=5.0.872.0, Culture=neutral, PublicKeyToken=09af7300eec23701">
      </qualifyAssembly>
    </assemblyBinding>
  </runtime>

Here is my hibernate.cfg.xml:

<session-factory name="NHSessionFactory">
    <property name="connection.provider">NHibernate.Connection.DriverConnectionProvider</property>
    <property name="connection.driver_class">PostgresDriver.DbDriver.DevartPgDriver, Devart.Data.PostgreSql</property>
    <property name="dialect">NHibernate.Dialect.PostgreSQL82Dialect</property>
    <property name="connection.connection_string">User Id=***;Password=***;Host=localhost;Port=5433;Database=***;</property>
    <property name="show_sql">true</property>    
    <property name="format_sql">true</property
  </session-factory>

When I call sessionFactory = cfg.BuildSessionFactory(); I get the following error: "Could not load type 'PostgresDriver.DbDriver.DevartPgDriver' from assembly 'Devart.Data.PostgreSql, Version=7.2.80.0, Culture=neutral, PublicKeyToken=09af7300eec23701'."

When I try to instantiate the driver class DevartPgDriver dr = new DevartPgDriver(); I get the error under the static members:

NHibernate.Driver.ReflectionBasedDriver.ReflectionTypedProviderExceptionMessageTemplate
"The IDbCommand and IDbConnection implementation in the assembly {0} could not be found. Ensure that the assembly {0} is located in the application directory or in the Global Assembly Cache. If the assembly is in the GAC, use <qualifyAssembly/> element in the application configuration file to specify the full name of the assembly."

What am I missing? I have troubleshooted this issue for hours without much success. Please help!

Was it helpful?

Solution

After several hours of trial and error I was able to resolve the issue:

Instead of:

public DevartPgDriver()
        : base(
        "Devart.Data.PostgreSql",
        "Devart.Data.PostgreSql.PgSqlConnection",
        "Devart.Data.PostgreSql.PgSqlCommand")
    {
    }

It should have been:

public DevartPgDriver()
        : base(
        "Devart.Data.PostgreSql",
        "Devart.Data.PostgreSql",
        "PgSqlConnection",
        "PgSqlCommand")
    {
    }

I also added nhProperties.Add(NHibernate.Cfg.Environment.Hbm2ddlKeyWords, "none"); to the nHibernate configuration. Thanks Rippo for the direction.

OTHER TIPS

We have answered you at the Devart forum: http://forums.devart.com/viewtopic.php?f=3&t=28844.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top