[Mono-dev] Sybase ASA Odbc, timestamp, fractional seconds, possible bug in mono Odbc stack?
A Nagappan
anagappan at novell.com
Wed May 30 05:13:00 EDT 2007
Hi,
Committed revision 78175.
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 Wed, May 30, 2007 at 12:53 PM, in message
<200705300923.34705.mbd at dbc.dk>,
Mads Bondo Dydensborg <mbd at dbc.dk> wrote:
> tirsdag 29 maj 2007 11:24 skrev A Nagappan:
>> Hi,
>>
>> This patch should fix the issue,
>
> Thanks!
>
> And thanks for pointing out the OdbcParameter.cs file - with your
patch the
> two code parts matches eachoter, which I believe they should! :- )
>
> Are you going to update the mono svn base with this patch?
>
> Thanks again & regards,
>
> Mads
>
>
>>
>> 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