2010-04-21 Veerapuram Varadhan <vvaradhan@novell.com>
authorVeerapuram Varadhan <v.varadhan@gmail.com>
Wed, 21 Apr 2010 20:21:41 +0000 (20:21 -0000)
committerVeerapuram Varadhan <v.varadhan@gmail.com>
Wed, 21 Apr 2010 20:21:41 +0000 (20:21 -0000)
** Fixes #595918
* Tds70.cs (WriteParameterInfo): Write updated decimal value
according to specified scale value.

svn path=/trunk/mcs/; revision=155912

mcs/class/Mono.Data.Tds/Mono.Data.Tds.Protocol/ChangeLog
mcs/class/Mono.Data.Tds/Mono.Data.Tds.Protocol/Tds70.cs
mcs/class/System.Data/Test/ProviderTests/System.Data.SqlClient/ChangeLog
mcs/class/System.Data/Test/ProviderTests/System.Data.SqlClient/SqlParameterTest.cs
mcs/class/System.Data/Test/ProviderTests/app-net_2_0.config

index 56fda9fcb2cb94911bb9c7c069a143ecae06fe80..da0816093101a98d924b52f792749692d329fe49 100644 (file)
@@ -1,3 +1,9 @@
+2010-04-21  Veerapuram Varadhan  <vvaradhan@novell.com>
+
+       ** Fixes #595918
+       * Tds70.cs (WriteParameterInfo): Write updated decimal value according 
+       to specified scale value.
+       
 2009-08-17  Veerapuram Varadhan  <vvaradhan@novell.com>
 
        ** Fixes #381151 NRE 
index a7c78a0f9e4a57fa2c780cb2b7edcc10072aade9..57fb0914645e385fc2638e012dba459829845478 100644 (file)
@@ -563,6 +563,14 @@ namespace Mono.Data.Tds.Protocol
                        if ( param.TypeName == "decimal" || param.TypeName == "numeric") {
                                Comm.Append ((param.Precision !=0 ) ? param.Precision : (byte) 29);
                                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));
+                                       int pVal = (int)(((decimal)param.Value) * expo);
+                                       param.Value = (decimal)pVal;                            
+                               }
                        }
 
                        
index ef4dab6eb63fc7e3b05fc00407b2f1fa66c8ff03..579c7219b6832b36353112383b40662ab9dabc9f 100644 (file)
@@ -1,3 +1,7 @@
+2010-04-21  Veerapuram Varadhan  <vvaradhan@novell.com>
+
+       * SqlParameterTest.cs: Add test for bug#595918.
+       
 2009-08-01  Gert Driesen  <drieseng@users.sourceforge.net>
 
        * SqlDataReaderTest.cs: Fixes for SQL Server 7.0 / TDS 7. Avoid
index e0e987246cdeba71d1f8df8b9e8dc2590390d7ce..f521d3e369e7e768a7cbbc2bf2eabc7281a82887 100644 (file)
@@ -402,6 +402,96 @@ namespace MonoTests.System.Data.SqlClient
                        }
                }
 
+               [Test] // bug #595918
+               public void DecimalDefaultScaleTest ()
+               {
+                       string create_tbl = "CREATE TABLE #decimalScaleCheck (decsclcheck DECIMAL (19, 5) null)";
+                       string create_sp = "CREATE PROCEDURE #sp_bug595918(@decsclcheck decimal(19,5) OUT)"
+                               + "AS " + Environment.NewLine
+                               + "BEGIN" + Environment.NewLine
+                               + "INSERT INTO #decimalScaleCheck values (@decsclcheck)" + Environment.NewLine
+                               + "SELECT @decsclcheck=decsclcheck from #decimalScaleCheck" + Environment.NewLine
+                               + "END";
+                       
+                       cmd = new SqlCommand (create_tbl, conn);
+                       cmd.ExecuteNonQuery ();
+                       
+                       cmd.CommandText = create_sp;
+                       cmd.ExecuteNonQuery ();
+                       
+                       cmd.CommandText = "[#sp_bug595918]";
+                       cmd.CommandType = CommandType.StoredProcedure;
+                       SqlParameter pValue = new SqlParameter("@decsclcheck", SqlDbType.Decimal);
+                       pValue.Value = 128.425;
+                       pValue.Precision = 19;
+                       pValue.Scale = 3;
+                       pValue.Direction = ParameterDirection.InputOutput;
+                       cmd.Parameters.Add(pValue);
+                       cmd.ExecuteNonQuery();
+
+                       Assert.AreEqual (128.425, pValue.Value, "Stored decimal value is incorrect - DS - Bug#595918");
+               }
+               
+               [Test] // bug #595918
+               public void DecimalGreaterScaleTest ()
+               {
+                       string create_tbl = "CREATE TABLE #decimalScaleCheck (decsclcheck DECIMAL (19, 5) null)";
+                       string create_sp = "CREATE PROCEDURE #sp_bug595918(@decsclcheck decimal(19,5) OUT)"
+                               + "AS " + Environment.NewLine
+                               + "BEGIN" + Environment.NewLine
+                               + "INSERT INTO #decimalScaleCheck values (@decsclcheck)" + Environment.NewLine
+                               + "SELECT @decsclcheck=decsclcheck from #decimalScaleCheck" + Environment.NewLine
+                               + "END";
+                       
+                       cmd = new SqlCommand (create_tbl, conn);
+                       cmd.ExecuteNonQuery ();
+                       
+                       cmd.CommandText = create_sp;
+                       cmd.ExecuteNonQuery ();
+                       
+                       cmd.CommandText = "[#sp_bug595918]";
+                       cmd.CommandType = CommandType.StoredProcedure;
+                       SqlParameter pValue = new SqlParameter("@decsclcheck", SqlDbType.Decimal);
+                       pValue.Value = 128.425;
+                       pValue.Precision = 19;
+                       pValue.Scale = 5;
+                       pValue.Direction = ParameterDirection.InputOutput;
+                       cmd.Parameters.Add(pValue);
+                       cmd.ExecuteNonQuery();
+
+                       Assert.AreEqual (128.42500, pValue.Value, "Stored decimal value is incorrect - GS - Bug#595918");
+               }
+
+               [Test] // bug #595918
+               public void DecimalLesserScaleTest ()
+               {
+                       string create_tbl = "CREATE TABLE #decimalScaleCheck (decsclcheck DECIMAL (19, 5) null)";
+                       string create_sp = "CREATE PROCEDURE #sp_bug595918(@decsclcheck decimal(19,5) OUT)"
+                               + "AS " + Environment.NewLine
+                               + "BEGIN" + Environment.NewLine
+                               + "INSERT INTO #decimalScaleCheck values (@decsclcheck)" + Environment.NewLine
+                               + "SELECT @decsclcheck=decsclcheck from #decimalScaleCheck" + Environment.NewLine
+                               + "END";
+                       
+                       cmd = new SqlCommand (create_tbl, conn);
+                       cmd.ExecuteNonQuery ();
+                       
+                       cmd.CommandText = create_sp;
+                       cmd.ExecuteNonQuery ();
+                       
+                       cmd.CommandText = "[#sp_bug595918]";
+                       cmd.CommandType = CommandType.StoredProcedure;
+                       SqlParameter pValue = new SqlParameter("@decsclcheck", SqlDbType.Decimal);
+                       pValue.Value = 128.425;
+                       pValue.Precision = 19;
+                       pValue.Scale = 2;
+                       pValue.Direction = ParameterDirection.InputOutput;
+                       cmd.Parameters.Add(pValue);
+                       cmd.ExecuteNonQuery();
+
+                       Assert.AreEqual (128.42, pValue.Value, "Stored decimal value is incorrect - LS - Bug#595918");
+               }
+
                int ClientVersion {
                        get {
                                return (engine.ClientVersion);
index 9553bd2ee1145c2f9d44f3f5854c2c23fdf4d886..a7d90214dacf2b905a166611ae8b98f3136c5ede 100644 (file)
@@ -73,7 +73,7 @@
                        <connection
                                name="sqlserver-tds"
                                factory="System.Data.SqlClient"
-                               connectionString="server=164.99.99.212;database=monotest;user id=monotester;password=monotester;"
+                               connectionString="server=164.99.116.64;database=monotest;user id=monotester;password=monotester;"
                                engine="sqlserver2005" />
                        <connection
                                name="sqlserver-odbc"