Index: src/NHibernate/Dialect/Oracle9Dialect.cs =================================================================== --- src/NHibernate/Dialect/Oracle9Dialect.cs (revision 3695) +++ src/NHibernate/Dialect/Oracle9Dialect.cs (working copy) @@ -55,7 +55,7 @@ // having problems with both ODP and OracleClient from MS not being able // to read values out of a field that is DOUBLE PRECISION RegisterColumnType(DbType.Double, "DOUBLE PRECISION"); //"FLOAT(53)" ); - //RegisterColumnType(DbType.Guid, "CHAR(38)"); + RegisterColumnType(DbType.Guid, "RAW(16)"); RegisterColumnType(DbType.Int16, "NUMBER(5,0)"); RegisterColumnType(DbType.Int32, "NUMBER(10,0)"); RegisterColumnType(DbType.Int64, "NUMBER(20,0)"); Index: src/NHibernate/Driver/OracleDataClientDriver.cs =================================================================== --- src/NHibernate/Driver/OracleDataClientDriver.cs (revision 3695) +++ src/NHibernate/Driver/OracleDataClientDriver.cs (working copy) @@ -52,13 +52,20 @@ /// 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 - if (sqlType.DbType == DbType.Boolean) - { - sqlType = SqlTypeFactory.Int16; - } - base.InitializeParameter(dbParam, name, sqlType); + // if the parameter coming in contains a boolean or guid then we need to convert it + // to another type since ODP.NET doesn't support DbType.Boolean or DbType.Guid + switch (sqlType.DbType) + { + case (DbType.Boolean): + sqlType = SqlTypeFactory.Int16; + break; + + case (DbType.Guid): + sqlType = SqlTypeFactory.GetBinary(16); + break; + } + + base.InitializeParameter(dbParam, name, sqlType); } #region IEmbeddedBatcherFactoryProvider Members Index: src/NHibernate/Type/GuidType.cs =================================================================== --- src/NHibernate/Type/GuidType.cs (revision 3695) +++ src/NHibernate/Type/GuidType.cs (working copy) @@ -28,10 +28,9 @@ { return rs.GetGuid(index); } - else - { - return new Guid(Convert.ToString(rs[index])); - } + + return (rs.GetFieldType(index) == typeof(byte[])) ? + new Guid((byte[])rs[index]) : new Guid(Convert.ToString(rs[index])); } /// @@ -53,7 +52,9 @@ public override void Set(IDbCommand cmd, object value, int index) { - ((IDataParameter)cmd.Parameters[index]).Value = value; + ((IDataParameter)cmd.Parameters[index]).Value = + (((IDbDataParameter)cmd.Parameters[index]).DbType == DbType.Binary) ? + new Guid(value.ToString()).ToByteArray() : value; } ///