[Mono-dev] Sybase ASA Odbc, timestamp, fractional seconds, possible bug in mono Odbc stack?

A Nagappan anagappan at novell.com
Tue May 29 05:24:17 EDT 2007


Hi,

This patch should fix the issue,

Index: OdbcDataReader.cs
===================================================================
--- OdbcDataReader.cs   (revision 78100)
+++ OdbcDataReader.cs   (working copy)
@@ -727,12 +727,10 @@
                                        OdbcTimestamp ts_data = new
OdbcTimestamp();
                                        ret = libodbc.SQLGetData
(hstmt, ColIndex, col.SqlCType, ref ts_data, 0, ref outsize);
                                        if (outsize!=-1) {// This means
SQL_NULL_DATA
-                                               /* Sybase returns the
fraction values in nano seconds,
-                                                  but DateTime expects
the value in milliseconds,
-                                                  so the conversion.
*/
-                                               int fraction =
Convert.ToInt32 (ts_data.fraction > 999 ? ts_data.fraction / 1000000 :
ts_data.fraction);
                                                DataValue = new
DateTime(ts_data.year,ts_data.month,ts_data.day,ts_data.hour,
-                                                                     
ts_data.minute,ts_data.second, fraction);
+                                                                     
ts_data.minute,ts_data.second);
+                                               if (ts_data.fraction !=
0)
+                                                       DataValue =
((DateTime) DataValue).AddTicks (ts_data.fraction / 100);
                                        }
                                        break;
                                case OdbcType.VarBinary :

In OdbcParameter.cs, the DateTime value is being written to database
with proper nano seconds as fraction. Check 'case OdbcType.DateTime'

Thanks
Nagappan


Nagappan A <anagappan at novell.com>
Linux Desktop Testing Project - http://ldtp.freedesktop.org
http://nagappanal.blogspot.com

Novell, Inc.
SUSE* Linux Enterprise 10
Your Linux is ready*
http://www.novell.com/linux



>>> On Mon, May 28, 2007 at  2:17 AM, in message
<200705272247.29112.mbd at dbc.dk>,
Mads Bondo Dydensborg <mbd at dbc.dk> wrote: 
> fredag 25 maj 2007 11:30 skrev A Nagappan:
>> Hi,
>> 
>> Fixed the issue in SVN trunk - revision 77937.
> 
> Thanks a lot.
> 
> I have two quibbs with the code though:
> 
> if (outsize!=-1) {// This means SQL_NULL_DATA
>   /* Sybase returns the fraction values in nano seconds,
>      but DateTime expects the value in milliseconds,
>      so the conversion. */
>   int fraction = Convert.ToInt32 (ts_data.fraction > 999 ?
ts_data.fraction / 
> 
> 1000000 : ts_data.fraction);
>   DataValue = new 
> DateTime(ts_data.year,ts_data.month,ts_data.day,ts_data.hour,
> 			   ts_data.minute,ts_data.second, fraction);
> }
> 
> Now, if a database server with a precision _higher_ than ms, say ns,
has two 
> 
> datetimes, where the fractional value is 375 ns and 1050 ns, 1050 is
later 
> in 
> time than 375. However, when converted to TDateTime values in the
Odbc 
> datareader, they will become 375 ms and 0 ms, effectively swapping
order. 
> Apart from the wrongness - 375 ns should have become 0 ms, not 375 ms
- the 
> ordering is also quite inconvenient...
> 
> As you can read here, both db2 and oracle goes higher than ms sql
(and 
> sybase, 
> it seems): http://www.dbazine.com/db2/db2-disarticles/pelzer2
> 
> The other quibb is about updating the database. Clearly, when I hold
a 
> timestamp in the Mono C# stack, and wish to update a row with it, the

> conversion the other way is important too. I can't figure out where
this 
> happens? Otherwise, i would reckon all timestamp updates against a
odbc 
> datasource that uses (which I believe it should) nanoseconds as the 
> fractional, will get values between 0 and 999 nanoseconds,
effectively 
> destroying the precision.
> 
> I am still quite confused about this. My knowledge of ODBC is quite
limited. 
> 
> However, from various sources, e.g. 
>
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/odbc/htm/od
> bcc_data_types.asp
> I do get the impression that fractional values _should_ be in
nanoseconds.
> 
> In other words: shouldn't we _always_ divide with 1000000? And,
shouldn't we 
> 
> somewhere else always multiply with 1000000?
> 
> I do not have access to other ODBC sources at the moment,
unfortunately, but 
> 
> the code tends to suggest that there must exists at least one odbc
source 
> that uses ms for its fractional value. I wonder if _that_ is not the
error.
> 
> Regards,
> 
> Mads
> 
> 
> 
> 
> 
> 
>> 
>> Thanks
>> Nagappan
>> 
>> Nagappan A <anagappan at novell.com>
>> Linux Desktop Testing Project - http://ldtp.freedesktop.org
>> http://nagappanal.blogspot.com
>> 
>> Novell, Inc.
>> SUSE* Linux Enterprise 10
>> Your Linux is ready*
>> http://www.novell.com/linux
>> 
>> 
>> >>> Mads Bondo Dydensborg <mbd at dbc.dk> 05/16/07 2:56 PM >>>
>> onsdag 16 maj 2007 11:08 skrev A Nagappan:
>> > Hi,
>> >   From the stack trace it looks like the issue is in
System.DateTime,
>> 
>> How did you determine this? My impression was that the ODBC stack
hands
>> over a 
>> frational second value in nanoseconds, and DateTime expects the
>> fractional 
>> value to be in milliseconds?
>> 
>> If that is the case, I can hardly blame DateTime for expecting a
>> millisecond 
>> value, can I?
>> 
>> Please advise.
>> 
>> Regards,
>> 
>> Mads
>> 
>> 
>> > could you please file a bug on that ? With a generic test-case to
>> > reproduce this bug.
>> > 
>> >
>>
http://bugzilla.ximian.com/enter_bug.cgi?product=Mono%3A%20Class%20Libraries
>> > and Component as System.
>> > 
>> > Thanks
>> > Nagappan
>> > 
>> > 
>> > Nagappan A <anagappan at novell.com>
>> > Linux Desktop Testing Project - http://ldtp.freedesktop.org
>> > http://nagappanal.blogspot.com
>> > 
>> > Novell, Inc.
>> > SUSE* Linux Enterprise 10
>> > Your Linux is ready*
>> > http://www.novell.com/linux
>> > 
>> > 
>> > 
>> > >>> On Fri, May 4, 2007 at  6:15 PM, in message
>> > <200705041445.27847.mbd at dbc.dk>,
>> > Mads Bondo Dydensborg <mbd at dbc.dk> wrote: 
>> > > fredag 04 maj 2007 10:56 skrev A Nagappan:
>> > >> Hi,
>> > >> 
>> > >> Could you please send me a test.cs file to reproduce this bug
?
>> > > 
>> > > Please find it attached.
>> > > 
>> > > Running "select PublishedTime from PublishingJob" from isql
returns:
>> > > 2007- 05- 03 10:57:15.000
>> > > 2007- 05- 03 10:57:15.920
>> > > 2007- 05- 03 10:57:15.000
>> > > 2007- 05- 03 10:57:15.000
>> > > 
>> > > And, the output from the test.cs program is:
>> > > 
>> > > $ mono -- debug test.exe
>> > > Creating connection
>> > > Opening connection
>> > > Executing command
>> > > Reading data
>> > > Column 0: 5/3/2007 10:57:15 AM
>> > > 
>> > > Unhandled Exception: System.ArgumentOutOfRangeException:
Argument is
>> > out of 
>> > > range.
>> > > Parameter name: Parameters describe an unrepresentable
DateTime.
>> > >   at System.DateTime..ctor (Int32 year, Int32 month, Int32 day,
>> Int32
>> > hour, 
>> > > Int32 minute, Int32 second, Int32 millisecond) [0x00000]
>> > >   at System.Data.Odbc.OdbcDataReader.GetValue (Int32 ordinal)
>> > [0x00415] 
>> > > in 
>> > >
>> >
>> 
>
/home/compile/Compile/Mono/mcs/class/System.Data/System.Data.Odbc/OdbcDataRea
>> > > der.cs:730
>> > >   at System.Data.Odbc.OdbcDataReader.get_Item (Int32 index)
>> [0x00000]
>> > 
>> > > in 
>> > >
>> >
>> 
>
/home/compile/Compile/Mono/mcs/class/System.Data/System.Data.Odbc/OdbcDataRea
>> > > der.cs:153
>> > >   at Test.OdbcTest.OdbcTest.Main (System.String[] args)
[0x00057] 
>> > > in /home/madsdyd/Tests/OdbcDateTime/test.cs:26
>> > > 
>> > > So, the first row is correctly made into a DateTime, the next
is
>> not.
>> > 
>> > > Stripping the fractional of all dates in the database works, but
is
>> > not 
>> > > really what I want :- )
>> > > 
>> > > Regards & thanks in advance for your help.
>> > > 
>> > > Mads
>> > 
>> > 
>> > 
>> > 
>> 
>> -- 
>> Med venlig hilsen/Regards
>> 
>> Systemudvikler/Systemsdeveloper cand.scient.dat, Ph.d., Mads Bondo
>> Dydensborg
>> Dansk BiblioteksCenter A/S, Tempovej 7-11, 2750 Ballerup, Tlf. +45
44 86
>> 77 34
>> 
>> 
>> 
>> 
> 
> -- 
> Med venlig hilsen/Regards
> 
> Systemudvikler/Systemsdeveloper cand.scient.dat, Ph.d., Mads Bondo 
> Dydensborg
> Dansk BiblioteksCenter A/S, Tempovej 7-11, 2750 Ballerup, Tlf. +45 44
86 77 
> 34




More information about the Mono-devel-list mailing list