[Mono-list] Problem with datetime format and oracle...

Daniel Morgan danielmorgan@verizon.net
Sat, 19 Feb 2005 19:14:45 -0500


I told you a fib.  Oracle's default date format is 'DD-MON-RR' which is 
"dd-MMM-yy" for System.DataTime.  I know this works since I successfully 
inserted a row using an OracleParameter.

Also, here is a list of books for Oracle 9i at Oracle Technology 
Network.  You need to be registered to use OTN.  If you are not 
registered (its free), I strongly suggest you do.

List of Oracle 9i books on OTN:
http://www.oracle.com/pls/db92/db92.docindex?remark=homepage

Oracle 9i SQL Reference - Format Models
http://download-west.oracle.com/docs/cd/B10501_01/server.920/a96540/sql_elements4a.htm#34512


In .NET 1.1 Framework Help, Search for "format specifiers, date and time 
format strings" and choose Custom DateTime Format Strings.
Or on the web at MSDN Library:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpguide/html/cpconcustomdatetimeformatstrings.asp

Right now, I am working on converting the Oracle Date format string to 
Mono's System.DateTime format string and vice-versa.  This code will end 
up in OracleDateTime as internal static functions.  I will be using 
OCINlsGetInfo since it works for me.   OCINlsGetInfo will be located in 
OracleConnection as an internal function.  I will try to commit to svn a 
working version (not complete) tonight.

Daniel Morgan wrote:

> The default date format for Oracle is 'DD-MMM-YY'.  Example: '13-FEB-02'
>
> The fix needs to be able to handle situations where the date format 
> could be changed via ALTER SESSION SET NLS_DATE_FORMAT, such as,
>
> ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD HH24:MI:SS';
>
> I have some ideas on how to solve it:
> 1. OCINlsGetInfo can be used to get the date format.  However, once I 
> got this, I would need to reformat the date from OracleDateTime or 
> DateTime to Oracle's date and vice-vesa.
> 2. (I haven't tried this yet - create DllImport's for OCI functions 
> OCIDateTimeToText and OCIDateTimeFromText and calls these functions 
> with an explicit
>    date format string.  Oracle's OCIDate can stay as an IntPtr and use 
> other OCI functions to deal with it. 3. There are even OCI functions 
> to put the OCIDate into a byte array or get the OCIDate from a byte 
> array.   OCIDateTimeFromArray and OCIDateTimeToArray.  DllImport's are 
> needed for these functions too.
>
> More info can be found in Oracle Call Interface Programmer's Guide.
>
> http://download-west.oracle.com/docs/cd/B10501_01/appdev.920/a96584/oci18m36.htm#512147 
>
> **
>
> Here is working code so far...
>
>        private string GetSessionNlsDateFormat()
>        {
>            byte[] buffer = new Byte[64];
>            uint bufflen = (uint) buffer.Length;
>            ushort item = (ushort) OciNlsServiceType.DATEFORMAT;
>            IntPtr session = connection.Session;
>            int st = OciCalls.OCINlsGetInfo (session, 
> connection.ErrorHandle,
>                ref buffer, bufflen, item);
>            // Get length of returned string
>            int     rsize = 0;
>            IntPtr    env = connection.Environment;
>            OciCalls.OCICharSetToUnicode (env, null, buffer, out rsize);
>                      // Get string
>            StringBuilder ret = new StringBuilder(rsize);
>            OciCalls.OCICharSetToUnicode (env, ret, buffer, out rsize);
>
>            string nlsDateFormat = ret.ToString ();
>            return nlsDateFormat;
>        }
>
>        internal static int OCINlsGetInfo (IntPtr hndl,
>            IntPtr errhp,
>            ref byte[] bufp,
>            uint buflen,
>            ushort item)
>        {
>            Trace.WriteLineIf(traceOci, "OCINlsGetInfo", "OCI");
>            return OciNativeCalls.OCINlsGetInfo (hndl, errhp, bufp, 
> buflen, item);
>        }
>
>            [DllImport ("oci")]
>            internal static extern int OCINlsGetInfo (IntPtr hndl,
>                IntPtr errhp,
>                [In][Out] byte[] bufp,
>                uint buflen,
>                ushort item);
>
>
>
>
> Hubert FONGARNAND wrote:
>
>> I use mono to deal with an oracle database...
>> the date format of my oracle database is "DD/MM/YY"
>> but mono always send date like "DD/MM/YYYY"
>> my NLS_LANG parameter is : NLS_LANG="AMERICAN_AMERICA.WE8ISO8859P1"
>>
>>
>>  
>>
>
> _______________________________________________
> Mono-list maillist  -  Mono-list@lists.ximian.com
> http://lists.ximian.com/mailman/listinfo/mono-list
>