Oracle Driver issue with Win 2008 64 bit

988 views
Skip to first unread message

Ying Guo

unread,
Feb 23, 2011, 3:25:56 PM2/23/11
to nhu...@googlegroups.com
When I trying to migrate into 2008 64bit I am getting the following exception
 
System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation. ---> System.InvalidOperationException: Attempt to load Oracle client libraries threw BadImageFormatException.  This problem will occur when running in 64 bit mode with the 32 bit Oracle client components installed. ---> System.BadImageFormatException: An attempt was made to load a program with an incorrect format. (Exception from HRESULT: 0x8007000B)
   at System.Data.Common.UnsafeNativeMethods.OCILobCopy2(IntPtr svchp, IntPtr errhp, IntPtr dst_locp, IntPtr src_locp, UInt64 amount, UInt64 dst_offset, UInt64 src_offset)
at System.Data.OracleClient.OCI.DetermineClientVersion()
   --- End of inner exception stack trace ---
   at System.Data.OracleClient.OCI.DetermineClientVersion()
   at System.Data.OracleClient.OracleInternalConnection.OpenOnLocalTransaction(String userName, String password, String serverName, Boolean integratedSecurity, Boolean unicode, Boolean omitOracleConnectionName)
   at System.Data.OracleClient.OracleInternalConnection..ctor(OracleConnectionString connectionOptions)
   at System.Data.OracleClient.OracleConnectionFactory.CreateConnection(DbConnectionOptions options, Object poolGroupProviderInfo, DbConnectionPool pool, DbConnection owningObject)
   at System.Data.ProviderBase.DbConnectionFactory.CreatePooledConnection(DbConnection owningConnection, DbConnectionPool pool, DbConnectionOptions options)
   at System.Data.ProviderBase.DbConnectionPool.CreateObject(DbConnection owningObject)
   at System.Data.ProviderBase.DbConnectionPool.UserCreateRequest(DbConnection owningObject)
   at System.Data.ProviderBase.DbConnectionPool.GetConnection(DbConnection owningObject)
   at System.Data.ProviderBase.DbConnectionFactory.GetConnection(DbConnection owningConnection)
   at System.Data.ProviderBase.DbConnectionClosed.OpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory)
   at System.Data.OracleClient.OracleConnection.Open()
 
This is running an web service application in IIS.
a) I have the IIS application pool running as 32 enable.
b) Orcale client was installed as 64 bit and SQLPlus connect testing okay from console.
c) same configurations project works fine for 2003 server or local x86 32bit box. (same database)
d) try to build the project to target x86 does not help.
 
 
Any help will be appreciated.
The thing confuse me is that, I have app_pool run with 32bit enable and Oracle driver installed with 64 bit. it seems to complain the reverse way think 64 client calling 32 driver.
 
-------------- configuration XML ------------------
 
<
hibernate-configuration xmlns="urn:nhibernate-configuration-2.2">

<

reflection-optimizer use="true" />

<

session-factory>

<

property name="connection.provider">NHibernate.Connection.DriverConnectionProvider</property>

<

property name="dialect">NHibernate.Dialect.Oracle9iDialect</property>

<

property name="connection.driver_class">NHibernate.Driver.OracleClientDriver</property>

<

property name="connection.connection_string">Data Source=dcap;User Id=CAPTURE_USER; Password=captureuser1</property>

<

property name="proxyfactory.factory_class">

NHibernate.ByteCode.LinFu.ProxyFactoryFactory,

NHibernate.ByteCode.LinFu

</

property>

<

property name="show_sql">true</property>

<

mapping assembly="captureDBCore"/>

</

session-factory>

</

hibernate-configuration>

turibbio

unread,
Feb 23, 2011, 5:09:51 PM2/23/11
to nhusers
Hi Ying Guo, I've faced the same problem few days ago.
First of all, I've to clearify one thing, it is not an NHibernate
related problem!
Here is what worked for me: if you don't know, Win Server 2008 R2 has
2 different folder for GAC (GAC_32 & GAC_64). You have to check if, in
the right folder based on what target platform you've chosen compiling
your software, there's an Oracle.DataAccess.dll (or
OracleDataClient.dll if you use old .Net provider). The
BadImageFormatException it's an exception that come up when .net
engine will find a mismatch between target platform.

Anyway, you can also set to false the IIS setting about 32 bit. If
your app is compilied in 32 bit, it will looking for in GAC32 for
Oracle Driver.
In my app I've used Oracle.DataAccess.dll and I have installed ODP.NET
with ODAC (11g R2) on our service tier (where NHibernate apps are
hosted). Besides, SQLPlus, if tnsnames is correctly configured, will
always log you in, 'cause it doens't use .net oracle provider, but
oracle native provider.

HTH, anyway I'm here :)




On 23 Feb, 21:25, Ying Guo <hen...@gmail.com> wrote:
>  When I trying to migrate into 2008 64bit I am getting the following
> exception
>
> System.Reflection.TargetInvocationException: Exception has been thrown by
> the target of an invocation. ---> System.InvalidOperationException: Attempt
> to load Oracle client libraries threw BadImageFormatException.  This problem
> will occur when running in 64 bit mode with the 32 bit Oracle client
> components installed. ---> System.BadImageFormatException: An attempt was
> made to load a program with an incorrect format. (Exception from HRESULT:
> 0x8007000B)
>    at System.Data.Common.UnsafeNativeMethods.OCILobCopy2(IntPtr svchp
> IntPtr errhp, IntPtr dst_locp, IntPtr src_locp, UInt64 amount, UInt64
> dst_offset, UInt64 src_offset)
> at System.Data.OracleClient.OCI.DetermineClientVersion()
>    --- End of inner exception stack trace ---
>    at System.Data.OracleClient.OCI.DetermineClientVersion()
>    at
> System.Data.OracleClient.OracleInternalConnection.OpenOnLocalTransaction(St­ring
> userName, String password, String serverName, Boolean integratedSecurity,
> Boolean unicode, Boolean omitOracleConnectionName)
>    at
> System.Data.OracleClient.OracleInternalConnection..ctor(OracleConnectionStr­ing
> connectionOptions)
>    at
> System.Data.OracleClient.OracleConnectionFactory.CreateConnection(DbConnect­ionOptions
> options, Object poolGroupProviderInfo, DbConnectionPool pool, DbConnection
> owningObject)
>    at
> System.Data.ProviderBase.DbConnectionFactory.CreatePooledConnection(DbConne­ction

Ying Guo

unread,
Feb 23, 2011, 7:08:42 PM2/23/11
to nhu...@googlegroups.com
Thanks for the reply, Turibbio.
I understand this is a platform related issue. However still having trouble to find a solution.
 
I've check the C:\windows\Assembly for 2008 R2
The two oracle entry in there are
Oracle.dataaccess AMD64
oracle.web AMD64
I dont see another location
 
for the 2003 server GAC
Oracle.DataAccess x86
Oracle.Web x86.
 
I guess I could try to have x86 oracle driver intalled on this box instead??
I guess I could also try to convert into using ODP.NET driver.
 
So what platform your application running under? anyCpu x64 or x86 ?
and also could you send me ur hibernate configuration?
 
thanks
 
Ying Guo
--
You received this message because you are subscribed to the Google Groups "nhusers" group.
To post to this group, send email to nhu...@googlegroups.com.
To unsubscribe from this group, send email to nhusers+u...@googlegroups.com.
For more options, visit this group at http://groups.google.com/group/nhusers?hl=en.


turibbio

unread,
Feb 24, 2011, 4:20:03 AM2/24/11
to nhusers
Hi Ying Guo,

Actually you've to check in the folder "C:\Windows\Microsoft.NET
\assembly", both in GAC_32 & GAC_34 folders.
If you cannot find oracledataaccess.dll (or oracleclient.dll for
old .net provider) in 2.x or in 4 folders, you need to install
providers.
In my app, I use Oracle 11g, then I've installed ODP.NET with ODAC 11g
Release2.

Like in my previous mail, my testing environment is based on Win2008
R2. I compile solution in "AnyCpu".

This is my NH configuration file:

<hibernate-configuration xmlns="urn:nhibernate-configuration-2.2" >
<session-factory name="NHibernate.Test">
<property
name="connection.provider">NHibernate.Connection.DriverConnectionProvider</
property>
<property name="dialect">NHibernate.Dialect.Oracle10gDialect</
property>
<property
name="connection.driver_class">NHibernate.Driver.OracleClientDriver</
property>
<property name="connection.connection_string">Data
Source=ORACLE_INSTANCE;User ID=USER;Password=PASSWORD; Connection
Lifetime=180;</property>
<property name="show_sql">true</property>
<property
name="proxyfactory.factory_class">NHibernate.ByteCode.Castle.ProxyFactoryFactory,NHibernate.ByteCode.Castle</
property>
<mapping assembly="MyAssembly" />
</session-factory>
</hibernate-configuration>

HTH




On 24 Feb, 01:08, Ying Guo <hen...@gmail.com> wrote:
> Thanks for the reply, Turibbio.
> I understand this is a platform related issue. However still having trouble
> to find a solution.
>
> I've check the C:\windows\Assembly for 2008 R2
> The two oracle entry in there are
> Oracle.dataaccess AMD64
> oracle.web AMD64
> I dont see another location
>
> for the 2003 server GAC
> Oracle.DataAccess x86
> Oracle.Web x86.
>
> I guess I could try to have x86 oracle driver intalled on this box instead??
> I guess I could also try to convert into using ODP.NET <http://odp.net/>
>  driver.
>
> So what platform your application running under? anyCpu x64 or x86 ?
> and also could you send me ur hibernate configuration?
>
> thanks
>
> Ying Guo
>
>
>
> On Wed, Feb 23, 2011 at 4:09 PM, turibbio <turib...@gmail.com> wrote:
> > Hi Ying Guo, I've faced the same problem few days ago.
> > First of all, I've to clearify one thing, it is not an NHibernate
> > related problem!
> > Here is what worked for me: if you don't know, Win Server 2008 R2 has
> > 2 different folder for GAC (GAC_32 & GAC_64). You have to check if, in
> > the right folder based on what target platform you've chosen compiling
> > your software, there's an Oracle.DataAccess.dll (or
> > OracleDataClient.dll if you use old .Net provider). The
> > BadImageFormatException it's an exception that come up when .net
> > engine will find a mismatch between target platform.
>
> > Anyway, you can also set to false the IIS setting about 32 bit. If
> > your app is compilied in 32 bit, it will looking for in GAC32 for
> > Oracle Driver.
> > In my app I've used Oracle.DataAccess.dll and I have installed ODP.NET<http://odp.net/>
> >http://groups.google.com/group/nhusers?hl=en.- Nascondi testo citato
>
> - Mostra testo citato -

Ying Guo

unread,
Feb 24, 2011, 5:00:39 PM2/24/11
to nhu...@googlegroups.com
Hi
 
Finally got it resolved by install the Oracle client with 32bit onto the server.
I am running IIS in 32 mode. Oracle client with 64 bit installed. (the client package actually have all the driver included)
The misleading part is the Exception says is looking for 64 driver , it is actually looking for 32 bit driver instead.
Thank HTH help clear this out.
 
Lesson learned:
32bit enable in IIS mode will run Web App in 32bit mode which from Nhibernate will look for 32bit driver.
Exceptions could be miss leading.
 
thanks.
 
Ying
Reply all
Reply to author
Forward
0 new messages