From 28800e2439e5b47ffd87bdc67d5ba6f4ea94da47 Mon Sep 17 00:00:00 2001 From: Veerapuram Varadhan Date: Sat, 10 Jul 2010 10:35:56 +0000 Subject: [PATCH] 2010-07-10 Veerapuram Varadhan ** Fixes 620860 * Tds70.cs (Precision): New virtual property to handle Precision values across different Tds versions. (WriteParameterInfo): Use defined Precision property instead of constant value. Also handle Ulong and long max/min values properly. * Tds80.cs (Precision): Override property to provide Tds 8 precision value. svn path=/trunk/mcs/; revision=160199 --- .../Mono.Data.Tds.Protocol/ChangeLog | 9 ++++++++ .../Mono.Data.Tds.Protocol/Tds70.cs | 23 ++++++++++++++----- .../Mono.Data.Tds.Protocol/Tds80.cs | 4 ++++ .../Mono.Data.Tds/TdsMetaParameter.cs | 2 +- 4 files changed, 31 insertions(+), 7 deletions(-) diff --git a/mcs/class/Mono.Data.Tds/Mono.Data.Tds.Protocol/ChangeLog b/mcs/class/Mono.Data.Tds/Mono.Data.Tds.Protocol/ChangeLog index 0671a158e22..69e3125f884 100644 --- a/mcs/class/Mono.Data.Tds/Mono.Data.Tds.Protocol/ChangeLog +++ b/mcs/class/Mono.Data.Tds/Mono.Data.Tds.Protocol/ChangeLog @@ -1,3 +1,12 @@ +2010-07-10 Veerapuram Varadhan + + ** Fixes 620860 + * Tds70.cs (Precision): New virtual property to handle Precision values + across different Tds versions. + (WriteParameterInfo): Use defined Precision property instead of + constant value. Also handle Ulong and long max/min values properly. + * Tds80.cs (Precision): Override property to provide Tds 8 precision value. + 2010-07-07 Veerapuram Varadhan * TdsComm.cs (Append[DateTime]): Ugh.. ugh.. final fix for handling MinValue for DateTime. diff --git a/mcs/class/Mono.Data.Tds/Mono.Data.Tds.Protocol/Tds70.cs b/mcs/class/Mono.Data.Tds/Mono.Data.Tds.Protocol/Tds70.cs index a0a64db3ee9..e804d143b97 100644 --- a/mcs/class/Mono.Data.Tds/Mono.Data.Tds.Protocol/Tds70.cs +++ b/mcs/class/Mono.Data.Tds/Mono.Data.Tds.Protocol/Tds70.cs @@ -76,6 +76,13 @@ namespace Mono.Data.Tds.Protocol protected virtual byte[] ClientVersion { get { return new byte[] {0x00, 0x0, 0x0, 0x70};} } + + // Default precision is 28 for a 7.0 server. Unless and + // otherwise the server is started with /p option - which would be 38 + protected virtual byte Precision { + get { return 28; } + } + #endregion // Properties #region Methods @@ -122,7 +129,7 @@ namespace Mono.Data.Tds.Protocol // Set default precision according to the TdsVersion // Current default is 29 for Tds80 if (p.TypeName == "decimal") - p.Precision = (p.Precision !=0 ? p.Precision : (byte) 18); + p.Precision = (p.Precision !=0 ? p.Precision : (byte) Precision); parms.Append (p.Prepare ()); if (p.Direction == TdsParameterDirection.Output) @@ -160,7 +167,7 @@ namespace Mono.Data.Tds.Protocol select.Append ("@" + parameterName); if (p.TypeName == "decimal") - p.Precision = (p.Precision !=0 ? p.Precision : (byte) 18); + p.Precision = (p.Precision !=0 ? p.Precision : (byte) Precision); declare.Append (String.Format ("declare {0}\n", p.Prepare ())); @@ -570,15 +577,19 @@ namespace Mono.Data.Tds.Protocol // Precision and Scale are non-zero for only decimal/numeric if ( param.TypeName == "decimal" || param.TypeName == "numeric") { - Comm.Append ((param.Precision !=0 ) ? param.Precision : (byte) 29); + Comm.Append ((param.Precision !=0 ) ? param.Precision : Precision); Comm.Append (param.Scale); // Convert the decimal value according to Scale if (param.Value != null && param.Value != DBNull.Value && ((decimal)param.Value) != Decimal.MaxValue && - ((decimal)param.Value) != Decimal.MinValue) { - decimal expo = new Decimal (System.Math.Pow (10, (double)param.Scale)); + ((decimal)param.Value) != Decimal.MinValue && + ((decimal)param.Value) != long.MaxValue && + ((decimal)param.Value) != long.MinValue && + ((decimal)param.Value) != ulong.MaxValue && + ((decimal)param.Value) != ulong.MinValue) { + long expo = (long)new Decimal (System.Math.Pow (10, (double)param.Scale)); long pVal = (long)(((decimal)param.Value) * expo); - param.Value = (decimal)pVal; + param.Value = pVal; } } diff --git a/mcs/class/Mono.Data.Tds/Mono.Data.Tds.Protocol/Tds80.cs b/mcs/class/Mono.Data.Tds/Mono.Data.Tds.Protocol/Tds80.cs index 5b541a026e8..b507da39f0e 100644 --- a/mcs/class/Mono.Data.Tds/Mono.Data.Tds.Protocol/Tds80.cs +++ b/mcs/class/Mono.Data.Tds/Mono.Data.Tds.Protocol/Tds80.cs @@ -61,6 +61,10 @@ namespace Mono.Data.Tds.Protocol { protected override byte[] ClientVersion { get { return new byte[] {0x00, 0x0, 0x0, 0x71};} } + protected override byte Precision { + get { return 38; } + } + #endregion // Properties #region Methods diff --git a/mcs/class/Mono.Data.Tds/Mono.Data.Tds/TdsMetaParameter.cs b/mcs/class/Mono.Data.Tds/Mono.Data.Tds/TdsMetaParameter.cs index 8ed81f7a16b..931afeafd9e 100644 --- a/mcs/class/Mono.Data.Tds/Mono.Data.Tds/TdsMetaParameter.cs +++ b/mcs/class/Mono.Data.Tds/Mono.Data.Tds/TdsMetaParameter.cs @@ -231,7 +231,7 @@ namespace Mono.Data.Tds { case "numeric": // msdotnet sends a default precision of 29 result.Append (String.Format ("({0},{1})", - (Precision == (byte)0 ? (byte)29 : Precision), Scale)); + (Precision == (byte)0 ? (byte)38 : Precision), Scale)); break; case "varchar": case "varbinary": -- 2.25.1