+2010-07-10 Veerapuram Varadhan <vvaradhan@novell.com>
+
+ ** 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 <vvaradhan@novell.com>
* TdsComm.cs (Append[DateTime]): Ugh.. ugh.. final fix for handling MinValue for DateTime.
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
// 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)
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 ()));
// 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;
}
}