[System.Data] Fix Azure SQL specific issues (ProviderTests) (#4622)
[mono.git] / mcs / class / System.Data / Test / ProviderTests / System.Data.SqlClient / SqlParameterTest.cs
index b2a0b7081494f200dd6333346fb36bc0052815da..893dba77c362f8ae5c4884cf98b51ed74b133b0e 100644 (file)
@@ -35,7 +35,7 @@ using System.Data.SqlClient;
 
 using NUnit.Framework;
 
-namespace MonoTests.System.Data.SqlClient
+namespace MonoTests.System.Data.Connected.SqlClient
 {
        [TestFixture]
        [Category ("sqlserver")]
@@ -44,12 +44,13 @@ namespace MonoTests.System.Data.SqlClient
                SqlConnection conn;
                SqlCommand cmd;
                SqlDataReader rdr;
+               EngineConfig engine;
 
                [SetUp]
                public void SetUp ()
                {
-                       conn = (SqlConnection) ConnectionManager.Singleton.Connection;
-                       ConnectionManager.Singleton.OpenConnection ();
+                       conn = ConnectionManager.Instance.Sql.Connection;
+                       engine = ConnectionManager.Instance.Sql.EngineConfig;
                }
 
                [TearDown]
@@ -59,12 +60,16 @@ namespace MonoTests.System.Data.SqlClient
                                cmd.Dispose ();
                        if (rdr != null)
                                rdr.Close ();
-                       ConnectionManager.Singleton.CloseConnection ();
+                       ConnectionManager.Instance.Close ();
                }
 
                [Test] // bug #324840
+               [Category("NotWorking")]
                public void ParameterSizeTest ()
                {
+                       if (ClientVersion == 7)
+                               Assert.Ignore ("Hangs on SQL Server 7.0");
+
                        string longstring = new String('x', 20480);
                        SqlParameter prm;
                        cmd = new SqlCommand ("create table #text1 (ID int not null, Val1 ntext)", conn);
@@ -119,6 +124,7 @@ namespace MonoTests.System.Data.SqlClient
                }
 
                [Test] // bug #382635
+               [Category("NotWorking")]
                public void ParameterSize_compatibility_Test ()
                {
                        string longstring = "abcdefghijklmnopqrstuvwxyz";
@@ -177,8 +183,8 @@ namespace MonoTests.System.Data.SqlClient
 
                        rdr = selectCmd.ExecuteReader ();
                        Assert.IsTrue (rdr.Read (), "#C1");
-                       Assert.AreEqual (20, rdr.GetValue (0), "#C2");
-                       Assert.AreEqual (longstring.Substring (0, 20), rdr.GetValue (1), "#C3");
+                       Assert.AreEqual (14, rdr.GetValue (0), "#C2");
+                       Assert.AreEqual (longstring.Substring (0, 14), rdr.GetValue (1), "#C3");
                        rdr.Close ();
                }
 
@@ -221,97 +227,269 @@ namespace MonoTests.System.Data.SqlClient
                        }
                }
 
-               [Test] // bug382589
-               public void DecimalMaxAsParamValueTest () 
+               [Test] // bug #382589
+               public void DecimalMaxAsParamValueTest ()
                {
-                   string create_sp = "CREATE PROCEDURE #sp_bug382539 (@decmax decimal(29,0) OUT)"
-                       + "AS " + Environment.NewLine
-                       + "BEGIN" + Environment.NewLine
-                       + "SET @decmax = 102.34" + Environment.NewLine
-                       + "END";
+                       if (ClientVersion == 7)
+                               Assert.Ignore ("Maximum precision is 28.");
 
-                   cmd = new SqlCommand (create_sp, conn);
-                   cmd.ExecuteNonQuery ();
+                       string create_sp = "CREATE PROCEDURE #sp_bug382539 (@decmax decimal(29,0) OUT)"
+                               + "AS " + Environment.NewLine
+                               + "BEGIN" + Environment.NewLine
+                               + "SET @decmax = 102.34" + Environment.NewLine
+                               + "END";
+
+                       cmd = new SqlCommand (create_sp, conn);
+                       cmd.ExecuteNonQuery ();
 
-                   cmd.CommandText = "[#sp_bug382539]";
-                   cmd.CommandType = CommandType.StoredProcedure;
-                   SqlParameter pValue = new SqlParameter("@decmax", Decimal.MaxValue);
-                   pValue.Direction = ParameterDirection.InputOutput;
-                   cmd.Parameters.Add(pValue);
+                       cmd.CommandText = "[#sp_bug382539]";
+                       cmd.CommandType = CommandType.StoredProcedure;
+                       SqlParameter pValue = new SqlParameter("@decmax", Decimal.MaxValue);
+                       pValue.Direction = ParameterDirection.InputOutput;
+                       cmd.Parameters.Add(pValue);
 
-                   Assert.AreEqual (Decimal.MaxValue, pValue.Value, "Parameter initialization value mismatch");
-                   cmd.ExecuteNonQuery();
+                       Assert.AreEqual (Decimal.MaxValue, pValue.Value, "Parameter initialization value mismatch");
+                       cmd.ExecuteNonQuery();
 
-                   Assert.AreEqual (102m, pValue.Value, "Parameter value mismatch");
+                       Assert.AreEqual (102m, pValue.Value, "Parameter value mismatch");
                }
 
-               [Test] // bug382589
-               public void DecimalMinAsParamValueTest () 
+               [Test] // bug #382589
+               public void DecimalMinAsParamValueTest ()
                {
-                   string create_sp = "CREATE PROCEDURE #sp_bug382539 (@decmax decimal(29,0) OUT)"
-                       + "AS " + Environment.NewLine
-                       + "BEGIN" + Environment.NewLine
-                       + "SET @decmax = 102.34" + Environment.NewLine
-                       + "END";
-
-                   cmd = new SqlCommand (create_sp, conn);
-                   cmd.ExecuteNonQuery ();
-
-                   cmd.CommandText = "[#sp_bug382539]";
-                   cmd.CommandType = CommandType.StoredProcedure;
-                   SqlParameter pValue = new SqlParameter("@decmax", Decimal.MinValue);
-                   pValue.Direction = ParameterDirection.InputOutput;
-                   cmd.Parameters.Add(pValue);
-           
-                   Assert.AreEqual (Decimal.MinValue, pValue.Value, "Parameter initialization value mismatch");
-                   cmd.ExecuteNonQuery();
-
-                   Assert.AreEqual (102m, pValue.Value, "Parameter value mismatch");
+                       if (ClientVersion == 7)
+                               Assert.Ignore ("Maximum precision is 28.");
+
+                       string create_sp = "CREATE PROCEDURE #sp_bug382539 (@decmax decimal(29,0) OUT)"
+                               + "AS " + Environment.NewLine
+                               + "BEGIN" + Environment.NewLine
+                               + "SET @decmax = 102.34" + Environment.NewLine
+                               + "END";
+
+                       cmd = new SqlCommand (create_sp, conn);
+                       cmd.ExecuteNonQuery ();
+
+                       cmd.CommandText = "[#sp_bug382539]";
+                       cmd.CommandType = CommandType.StoredProcedure;
+                       SqlParameter pValue = new SqlParameter("@decmax", Decimal.MinValue);
+                       pValue.Direction = ParameterDirection.InputOutput;
+                       cmd.Parameters.Add(pValue);
+
+                       Assert.AreEqual (Decimal.MinValue, pValue.Value, "Parameter initialization value mismatch");
+                       cmd.ExecuteNonQuery();
+
+                       Assert.AreEqual (102m, pValue.Value, "Parameter value mismatch");
                }
 
-               [Test] // bug# 382589
-               [ExpectedException (typeof (SqlException))]
-               public void DecimalMaxAsParamValueExceptionTest () 
+               [Test] // bug #382589
+               public void DecimalMaxAsParamValueExceptionTest ()
                {
-                   string create_sp = "CREATE PROCEDURE #sp_bug382539 (@decmax decimal(29,10) OUT)"
-                       + "AS " + Environment.NewLine
-                       + "BEGIN" + Environment.NewLine
-                       + "SET @decmax = 102.36" + Environment.NewLine
-                       + "END";
-
-                   cmd = new SqlCommand (create_sp, conn);
-                   cmd.ExecuteNonQuery ();
-
-                   cmd.CommandText = "[#sp_bug382539]";
-                   cmd.CommandType = CommandType.StoredProcedure;
-                   SqlParameter pValue = new SqlParameter("@decmax", Decimal.MaxValue);
-                   pValue.Direction = ParameterDirection.InputOutput;
-                   cmd.Parameters.Add(pValue);
-                   cmd.ExecuteNonQuery();
-                   Assert.Fail ("Expected exception didn't occur");
+                       if (ClientVersion == 7)
+                               Assert.Ignore ("Maximum precision is 28.");
+
+                       string create_sp = "CREATE PROCEDURE #sp_bug382539 (@decmax decimal(29,10) OUT)"
+                               + "AS " + Environment.NewLine
+                               + "BEGIN" + Environment.NewLine
+                               + "SET @decmax = 102.36" + Environment.NewLine
+                               + "END";
+
+                       cmd = new SqlCommand (create_sp, conn);
+                       cmd.ExecuteNonQuery ();
+
+                       cmd.CommandText = "[#sp_bug382539]";
+                       cmd.CommandType = CommandType.StoredProcedure;
+                       SqlParameter pValue = new SqlParameter("@decmax", Decimal.MaxValue);
+                       pValue.Direction = ParameterDirection.InputOutput;
+                       cmd.Parameters.Add(pValue);
+
+                       try {
+                               cmd.ExecuteNonQuery ();
+                               Assert.Fail ("#1");
+                       } catch (SqlException ex) {
+                               // Error converting data type numeric to decimal
+                               Assert.AreEqual (typeof (SqlException), ex.GetType (), "#2");
+                               Assert.AreEqual ((byte) 16, ex.Class, "#3");
+                               Assert.IsNull (ex.InnerException, "#4");
+                               Assert.IsNotNull (ex.Message, "#5");
+                               Assert.AreEqual (8114, ex.Number, "#6");
+                               Assert.AreEqual ((byte) 5, ex.State, "#7");
+                       }
                }
 
                [Test] // bug# 382589
-               [ExpectedException (typeof (SqlException))]
-               public void DecimalMinAsParamValueExceptionTest () 
+               public void DecimalMinAsParamValueExceptionTest ()
+               {
+                       if (ClientVersion == 7)
+                               Assert.Ignore ("Maximum precision is 28.");
+
+                       string create_sp = "CREATE PROCEDURE #sp_bug382539 (@decmax decimal(29,10) OUT)"
+                               + "AS " + Environment.NewLine
+                               + "BEGIN" + Environment.NewLine
+                               + "SET @decmax = 102.36" + Environment.NewLine
+                               + "END";
+
+                       cmd = new SqlCommand (create_sp, conn);
+                       cmd.ExecuteNonQuery ();
+
+                       cmd.CommandText = "[#sp_bug382539]";
+                       cmd.CommandType = CommandType.StoredProcedure;
+                       SqlParameter pValue = new SqlParameter("@decmax", Decimal.MinValue);
+                       pValue.Direction = ParameterDirection.InputOutput;
+                       cmd.Parameters.Add(pValue);
+                       try {
+                               cmd.ExecuteNonQuery ();
+                               Assert.Fail ("#1");
+                       } catch (SqlException ex) {
+                               // Error converting data type numeric to decimal
+                               Assert.AreEqual (typeof (SqlException), ex.GetType (), "#2");
+                               Assert.AreEqual ((byte) 16, ex.Class, "#3");
+                               Assert.IsNull (ex.InnerException, "#4");
+                               Assert.IsNotNull (ex.Message, "#5");
+                               Assert.AreEqual (8114, ex.Number, "#6");
+                               Assert.AreEqual ((byte) 5, ex.State, "#7");
+                       }
+               }
+
+               [Test] // bug #526794
+               public void ZeroLengthString ()
                {
-                   string create_sp = "CREATE PROCEDURE #sp_bug382539 (@decmax decimal(29,10) OUT)"
-                       + "AS " + Environment.NewLine
-                       + "BEGIN" + Environment.NewLine
-                       + "SET @decmax = 102.36" + Environment.NewLine
-                       + "END";
-
-                   cmd = new SqlCommand (create_sp, conn);
-                   cmd.ExecuteNonQuery ();
-
-                   cmd.CommandText = "[#sp_bug382539]";
-                   cmd.CommandType = CommandType.StoredProcedure;
-                   SqlParameter pValue = new SqlParameter("@decmax", Decimal.MinValue);
-                   pValue.Direction = ParameterDirection.InputOutput;
-                   cmd.Parameters.Add(pValue);
-                   cmd.ExecuteNonQuery();
-                   Assert.Fail ("Expected exception didn't occur");
+                       cmd = new SqlCommand ("create table #bug526794 (name varchar(20) NULL)", conn);
+                       cmd.ExecuteNonQuery ();
+
+                       SqlParameter param;
+
+                       param = new SqlParameter ("@name", SqlDbType.VarChar);
+                       param.Value = string.Empty;
+
+                       cmd = new SqlCommand ("insert into #bug526794 values (@name)", conn);
+                       cmd.Parameters.Add (param);
+                       cmd.ExecuteNonQuery ();
+
+                       cmd = new SqlCommand ("select * from #bug526794", conn);
+                       rdr = cmd.ExecuteReader ();
+                       Assert.IsTrue (rdr.Read (), "#A1");
+                       Assert.AreEqual (string.Empty, rdr.GetValue (0), "#A2");
+                       rdr.Close ();
+
+                       param = new SqlParameter ("@name", SqlDbType.Int);
+                       param.Value = string.Empty;
+
+                       cmd = new SqlCommand ("insert into #bug526794 values (@name)", conn);
+                       cmd.Parameters.Add (param);
+
+                       try {
+                               cmd.ExecuteNonQuery ();
+                               Assert.Fail ("#B1");
+                       } catch (FormatException ex) {
+                               // Failed to convert parameter value from a String to a Int32
+                               Assert.AreEqual (typeof (FormatException), ex.GetType (), "#B2");
+                               Assert.IsNotNull (ex.Message, "#B3");
+                               Assert.IsTrue (ex.Message.IndexOf (typeof (string).Name) != -1, "#B4");
+                               Assert.IsTrue (ex.Message.IndexOf (typeof (int).Name) != -1, "#B5");
+
+                               // Input string was not in a correct format
+                               Exception inner = ex.InnerException;
+                               Assert.IsNotNull (inner, "#B6");
+                               Assert.AreEqual (typeof (FormatException), inner.GetType (), "#B7");
+                               Assert.IsNull (inner.InnerException, "#B8");
+                               Assert.IsNotNull (inner.Message, "#B9");
+                       }
+               }
+
+               [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);
+                       }
+               }
        }
 }