Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save jwahyoung/c21efbb590e4392edc82 to your computer and use it in GitHub Desktop.
Save jwahyoung/c21efbb590e4392edc82 to your computer and use it in GitHub Desktop.
using System;
using System.Data;
using System.Data.Common;
using System.Reflection;
using NHibernate;
using NHibernate.AdoNet;
using NHibernate.Driver;
using NHibernate.Engine.Query;
using NHibernate.SqlTypes;
using NHibernate.Util;
using Oracle.ManagedDataAccess.Client; // Nuget dependency.
namespace myNamespace
{
/// <summary>
/// A NHibernate Driver for using the Oracle.ManagedDataAccess DataProvider
/// </summary>
public class OracleManagedDataClientDriver : DriverBase, IEmbeddedBatcherFactoryProvider
{
private static readonly SqlType GuidSqlType = new SqlType(DbType.Binary, 16);
private readonly IDriveConnectionCommandProvider connectionCommandProvider;
/// <summary>
/// Initializes a new instance of <see cref="OracleDataClientDriver"/>.
/// </summary>
/// <exception cref="HibernateException">
/// Thrown when the <c>Oracle.ManagedDataAccess</c> assembly can not be loaded.
/// </exception>
public OracleManagedDataClientDriver()
: base()
{
var factory = DbProviderFactories.GetFactory("Oracle.ManagedDataAccess.Client");
connectionCommandProvider = new DbProviderFactoryDriveConnectionCommandProvider(factory);
}
/// <summary></summary>
public override string NamedPrefix
{
get { return ":"; }
}
/// <summary></summary>
public override bool UseNamedPrefixInParameter
{
get { return true; }
}
/// <summary></summary>
public override bool UseNamedPrefixInSql
{
get { return true; }
}
public override IDbConnection CreateConnection()
{
return connectionCommandProvider.CreateConnection();
}
public override IDbCommand CreateCommand()
{
return connectionCommandProvider.CreateCommand();
}
/// <remarks>
/// This adds logic to ensure that a DbType.Boolean parameter is not created since
/// ODP.NET doesn't support it.
/// </remarks>
protected override void InitializeParameter(IDbDataParameter dbParam, string name, SqlType sqlType)
{
// if the parameter coming in contains a boolean then we need to convert it
// to another type since ODP.NET doesn't support DbType.Boolean
switch (sqlType.DbType)
{
case DbType.Boolean:
base.InitializeParameter(dbParam, name, SqlTypeFactory.Int16);
break;
case DbType.Guid:
base.InitializeParameter(dbParam, name, GuidSqlType);
break;
default:
base.InitializeParameter(dbParam, name, sqlType);
break;
}
}
protected override void OnBeforePrepare(IDbCommand command)
{
base.OnBeforePrepare(command);
// This might break, add excepti
var dbCommand = command as OracleCommand;
// need to explicitly turn on named parameter binding
// http://tgaw.wordpress.com/2006/03/03/ora-01722-with-odp-and-command-parameters/
dbCommand.BindByName = true;
var detail = CallableParser.Parse(dbCommand.CommandText);
if (!detail.IsCallable)
return;
dbCommand.CommandType = CommandType.StoredProcedure;
dbCommand.CommandText = detail.FunctionName;
dbCommand.BindByName = false;
var outCursor = (command.CreateParameter() as OracleParameter);
outCursor.OracleDbType = OracleDbType.RefCursor;
outCursor.Direction = detail.HasReturn ? ParameterDirection.ReturnValue : ParameterDirection.Output;
dbCommand.Parameters.Insert(0, outCursor);
}
System.Type IEmbeddedBatcherFactoryProvider.BatcherFactoryClass
{
get { return typeof(OracleDataClientBatchingBatcherFactory); }
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment