[Mono-list] System.Data.OracleClient on z/Linux

Daniel Morgan monodanmorg at yahoo.com
Thu Feb 14 20:28:41 EST 2008


Go to Mono's web site and go to the download page. 
Download the source code to mono if you have not
already.  Unarchive it somewhere.  I assume you know
how to ungzip and untar a file.

In the source, go to
mono_source/mcs/class/System.Data.OracleClient/System.Data.OracleClient.cs

And look in file OciStatementHandle.cs at function
Prepare.  You should see it calling the function
OCIUnicodeToCharSet.  You need to see what the
function is actually passing returning via
Console.Error.WriteLine calls.

Oracle Call Interface Programmer's Guide
http://download.oracle.com/docs/cd/B19306_01/appdev.102/b14250/toc.htm

Documentation for all Oracle products can be found
here:
http://tahiti.oracle.com/

sword OCIUnicodeToCharSet ( dvoid       *hndl, 
                            OraText     *dst, 
                            size_t      dstlen, 
                            CONST ub2   *src, 
                            size_t      srclen, 
                            size_t      *rsize );

The docs says these are the possible values that can
be returned: OCI_SUCCESS, OCI_INVALID_HANDLE. or
OCI_ERROR.  I'm not sure the proper way to marshal a
size_t that will work on 32-bit and 64-bits systems. 
Perhaps someone reading this can shed some light.

Also, take a look at OciCalls.cs and see how to enable
tracing.  You may need to re-build
System.Data.OracleClient to enable tracing.  And I
think you would also need to set OCI_TRACE to point to
the file to log tracing.

--- Edwin Kim <EKIM at transitchicago.com> wrote:

> Thanks much!!!
> 
> I'm new to Mono, OCI, and C#.
> I guess z/Linux running on the IBM z/800 (mainframe)
> is big endian.
> 
> I was able to display some information using
> environment variables:
>         export MONO_LOG_LEVEL=info
>         export MONO_LOG_MASK=dll
> 
> Console output:
> 
> Mono-INFO: Searching for 'OCISessionBegin'.
> Mono-INFO: Probing 'OCISessionBegin'.
> Mono-INFO: Found as 'OCISessionBegin'.
> Mono-INFO: DllImport attempting to load:
> 'libclntsh.so'.
> Mono-INFO: DllImport loading location:
> 'libclntsh.so'.
> Mono-INFO: Searching for 'OCIServerVersion'.
> Mono-INFO: Probing 'OCIServerVersion'.
> Mono-INFO: Found as 'OCIServerVersion'.
> Mono-INFO: DllImport attempting to load:
> 'libclntsh.so'.
> Mono-INFO: DllImport loading location:
> 'libclntsh.so'.
> Mono-INFO: Searching for 'OCICharSetToUnicode'.
> Mono-INFO: Probing 'OCICharSetToUnicode'.
> Mono-INFO: Found as 'OCICharSetToUnicode'.
> ServerVersion: Oracle Database
> DataSource: wpsdb
> Mono-INFO: DllImport attempting to load:
> 'libclntsh.so'.
> Mono-INFO: DllImport loading location:
> 'libclntsh.so'.
> Mono-INFO: Searching for 'OCIUnicodeToCharSet'.
> Mono-INFO: Probing 'OCIUnicodeToCharSet'.
> Mono-INFO: Found as 'OCIUnicodeToCharSet'.
> Unhandled Exception: System.NullReferenceException:
> Object reference not set to an instance of an object
>   at
>
System.Data.OracleClient.Oci.OciStatementHandle.Prepare
> (System.String commandText) [0x00000]
>   at
>
System.Data.OracleClient.OracleCommand.PrepareStatement
> (System.Data.OracleClient.Oci.OciStatementHandle
> statement) [0x00000]
>   at
> System.Data.OracleClient.OracleCommand.ExecuteReader
> (CommandBehavior behavior) [0x00000]
>   at
> System.Data.OracleClient.OracleCommand.ExecuteReader
> () [0x00000]
>   at (wrapper remoting-invoke-with-check)
> System.Data.OracleClient.OracleCommand:ExecuteReader
> ()
>   at Test.Main (System.String[] args) [0x00000]
> Mono-INFO: DllImport attempting to load:
> 'libclntsh.so'.
> Mono-INFO: DllImport loading location:
> 'libclntsh.so'.
> Mono-INFO: Searching for 'OCIHandleFree'.
> Mono-INFO: Probing 'OCIHandleFree'.
> Mono-INFO: Found as 'OCIHandleFree'.
> 
> and source code:
> using System;
> using System.Data;
> using System.Data.OracleClient;
> public class Test
> {
>    public static void Main (string[] args)
>    {
>        string connectionString =
>           "Data Source=wpsdb;" +
>           "User ID=test;" +
>           "Password=test;";
>        OracleConnection dbcon = null;
>        dbcon = new OracleConnection
> (connectionString);
>        dbcon.Open ();
>        Console.WriteLine("ServerVersion: " +
> dbcon.ServerVersion + "\nDataSource: " +
> dbcon.DataSource);
> 
>        OracleCommand dbcmd = dbcon.CreateCommand ();
>        string sql = "SELECT * FROM dual";
>        dbcmd.CommandText = sql;
>        OracleDataReader reader = dbcmd.ExecuteReader
> ();
>        while (reader.Read ()) {
>          System.Console.WriteLine( "." );
>        }
>        // clean up
>        reader.Close ();
>        reader = null;
>        dbcmd.CommandText = sql;
>        dbcmd.ExecuteNonQuery ();
>        dbcmd.Dispose ();
>        dbcmd = null;
>        dbcon.Close ();
>        dbcon = null;
>    }
> }
> 
> 
> ________________________________________
> From: Daniel Morgan [monodanmorg at yahoo.com]
> Sent: Tuesday, February 12, 2008 9:08 PM
> To: Edwin Kim
> Subject: Re: [Mono-list] System.Data.OracleClient on
> z/Linux
> 
> I'm sorry.  It does look that way.  You could use
> ODBC
> instead.  Or you could use a fully managed oracle
> provider, such as, one from DataDirect.
> 
> It looks like Mono's OracleClient fails trying to
> call
> the Prepare function.  Maybe OCI did not create an
> OCI
> statement handle.
> 
> If you look in source in OciStatementHandle, it may
> give you a clue where it is failing.  You could turn
> tracing on.
> 
> Or you could put a bunch of
> Console.Error.WriteLine's
> checking the output of function calls to see what is
> being returned.
> 
> dbcmd.commandText fails to compile because you were
> trying to access a member of OracleCommand that is
> private, protected, or internal.  C# is case
> sesitive.
>  If you need to access the CommandText property of
> OracleCommand, you have to spell it with the correct
> capitalization.
> 
> Is z/Linux running on the IBM z/800 big endian or
> little endian?  I assume big endian.
> 
> Mono's OracleClient was mainly developed on Windows
> and Linux on 32-bit x86.  So, there could be a
> problem
> with marshalling integers and unicode strings.  Does
> the IBM z/800 require alignment of integers?
> 
> --- Edwin Kim <ekim at transitchicago.com> wrote:
> 
> > Do you mean I can't use the OracleClient provider
> > yet?
> > z/linux is 64-bit running on IBM z/800 processor.
> >
> >
> > I was able to display the connection state and
> > dbcmd.CommandText on the screen:
> >
> > Code:
> >  using System;
> >  using System.Data;
> >  using System.Data.OracleClient;
> >
> >  public class Test
> >  {
> >     public static void Main (string[] args)
> >     {
> >        string connectionString =
> >           "Data Source=wpsdb;" +
> >           "User ID=test;" +
> >           "Password=test;";
> >        OracleConnection dbcon = null;
> >        dbcon = new OracleConnection
> > (connectionString);
> >        dbcon.Open ();
> >        Console.WriteLine("Connection State: " +
> > dbcon.State);
> >        Console.WriteLine("ServerVersion: " +
> > dbcon.ServerVersion + "\nDataSource: " +
> > dbcon.DataSource);
> >        string commandText = "SELECT * FROM dual";
> >        OracleCommand dbcmd = new OracleCommand
> > (commandText, dbcon);
> >        Console.WriteLine("commandText: " +
> > dbcmd.CommandText);
> >
> >        OracleDataReader reader =
> dbcmd.ExecuteReader
> > ();
> >        // clean up
> >        reader.Close ();
> >        reader = null;
> >        dbcmd.Dispose ();
> >        dbcmd = null;
> >        dbcon.Close ();
> >        dbcon = null;
> >     }
> >  }
> 
=== message truncated ===



      ____________________________________________________________________________________
Never miss a thing.  Make Yahoo your home page. 
http://www.yahoo.com/r/hs


More information about the Mono-list mailing list