2007-07-31 Nagappan A <anagappan@novell.com>
[mono.git] / mcs / class / System.Data / Test / ProviderTests / System.Data.SqlClient / SqlCommandTest.cs
index 32522cadde70cd1c53a772938c7ed3e9a0fd6e43..161cdb8f5dfb4910ccde05b6f9e6de3a9b5a6ed2 100644 (file)
@@ -33,6 +33,10 @@ using System;
 using System.Data;
 using System.Data.Common;
 using System.Data.SqlClient;
+#if NET_2_0
+using System.Data.Sql;
+using System.Xml;
+#endif
 
 using NUnit.Framework;
 
@@ -142,8 +146,13 @@ namespace MonoTests.System.Data.SqlClient
                        }catch (AssertionException e) {
                                throw e;
                        }catch (Exception e) {
+#if NET_2_0
+                               Assert.AreEqual (typeof (NullReferenceException), e.GetType (),
+                                       "#2 Incorrect Exception : " + e.StackTrace);
+#else
                                Assert.AreEqual (typeof (InvalidOperationException), e.GetType (),
                                        "#2 Incorrect Exception : " + e.StackTrace);
+#endif
                        }
 
                        // Check the Return value for a Correct Query 
@@ -256,8 +265,13 @@ namespace MonoTests.System.Data.SqlClient
                        }catch (AssertionException e) {
                                throw e;
                        }catch (Exception e) {
+#if NET_2_0
+                               Assert.AreEqual (typeof(NullReferenceException), e.GetType(),
+                                       "#2 Incorrect Exception : " + e);
+#else
                                Assert.AreEqual (typeof(InvalidOperationException), e.GetType(),
                                        "#2 Incorrect Exception : " + e);
+#endif
                        }
                        
                        // Test Exception is thrown if Query is incorrect 
@@ -356,25 +370,30 @@ namespace MonoTests.System.Data.SqlClient
                [Test]
                public void ExecuteReaderTest ()
                {
-                       SqlDataReader reader = null; 
+                       //SqlDataReader reader = null; 
                        conn = new SqlConnection (connectionString);
 
                        // Test exception is thrown if conn is closed
                        cmd = new SqlCommand ("Select count(*) from numeric_family");
                        try {
-                               reader = cmd.ExecuteReader ();
+                               /*reader = */cmd.ExecuteReader ();
                        }catch (AssertionException e) {
                                throw e;
                        }catch (Exception e) {
+#if NET_2_0
+                               Assert.AreEqual (typeof(NullReferenceException), e.GetType(),
+                                       "#1 Incorrect Exception");
+#else
                                Assert.AreEqual (typeof(InvalidOperationException), e.GetType(),
                                        "#1 Incorrect Exception");
+#endif
                        }
 
                        conn.Open ();
                        // Test exception is thrown for Invalid Query
                        cmd = new SqlCommand ("InvalidQuery", conn);
                        try {
-                               reader = cmd.ExecuteReader ();
+                               /*reader = */cmd.ExecuteReader ();
                                Assert.Fail ("#1 Exception shud be thrown");
                        }catch (AssertionException e) {
                                throw e;
@@ -391,12 +410,13 @@ namespace MonoTests.System.Data.SqlClient
        
                        // Test Connection  cannot be modified when reader is in use
                        // NOTE : msdotnet contradicts documented behavior      
+                       /*
                        cmd.CommandText = "select * from numeric_family where id=1";
                        reader = cmd.ExecuteReader ();
                        reader.Read ();
                        conn.Close (); // valid operation 
                        conn = new SqlConnection (connectionString);
-
+                       */
                        /*
                        // NOTE msdotnet contradcits documented behavior 
                        // If the above testcase fails, then this shud be tested        
@@ -521,7 +541,11 @@ namespace MonoTests.System.Data.SqlClient
 
                        // Test InvalidOperation Exception is thrown if Parameter Type
                        // is not explicitly set
+#if NET_2_0
+                       cmd.Parameters.AddWithValue ("@ID", 2);
+#else
                        cmd.Parameters.Add ("@ID", 2);
+#endif
                        try {
                                cmd.Prepare ();
                                Assert.Fail ("#1 Parameter Type shud be explicitly Set");
@@ -553,7 +577,7 @@ namespace MonoTests.System.Data.SqlClient
                                cmd.CommandType = CommandType.StoredProcedure;
                                cmd.CommandText = "ABFSDSFSF" ;
                                cmd.Prepare ();
-                       }catch (Exception e) {
+                       }catch {
                                Assert.Fail ("#7 Exception shud not be thrown for Stored Procs");
                        }
                        cmd.CommandType = CommandType.Text;     
@@ -589,8 +613,13 @@ namespace MonoTests.System.Data.SqlClient
                        }catch (AssertionException e) {
                                throw e;
                        }catch (Exception e) {
+#if NET_2_0
+                               Assert.AreEqual (typeof(NullReferenceException), e.GetType(),
+                                       "Incorrect Exception : " + e.StackTrace);
+#else
                                Assert.AreEqual (typeof(InvalidOperationException), e.GetType(),
                                        "Incorrect Exception : " + e.StackTrace);
+#endif
                        }
                }
 
@@ -664,8 +693,13 @@ namespace MonoTests.System.Data.SqlClient
                                cmd.ExecuteNonQuery (); 
                                Assert.Fail ("#2 Connection cannot be different");
                        }catch (Exception e) {
+#if NET_2_0
+                               Assert.AreEqual (typeof(NullReferenceException), e.GetType(),
+                                       "#3 Incorrect Exception : " + e);
+#else
                                Assert.AreEqual (typeof(InvalidOperationException), e.GetType(),
                                        "#3 Incorrect Exception : " + e);
+#endif
                        }finally {
                                conn1.Close ();
                                conn.Close ();
@@ -739,7 +773,7 @@ namespace MonoTests.System.Data.SqlClient
                                                        connectionString + ";Pooling=false");
                        using (conn) {
                                conn.Open ();
-                               int size = conn.PacketSize ; 
+                               /*int size = conn.PacketSize ; */
                                SqlCommand cmd = conn.CreateCommand ();
                                // create a temp stored proc .. 
                                cmd.CommandText  = "Create Procedure #sp_tmp_long_params ";
@@ -867,25 +901,569 @@ namespace MonoTests.System.Data.SqlClient
                        Object TestPar = DBNull.Value;
                        cmd.Parameters.Add("@TestPar1", SqlDbType.Int);
                        cmd.Parameters["@TestPar1"].Value = TestPar;
-                       cmd.Parameters.Add("@BirthDate", DateTime.Now);
+#if NET_2_0
+                       cmd.Parameters.AddWithValue ("@BirthDate", DateTime.Now);
+#else
+                       cmd.Parameters.Add ("@BirthDate", DateTime.Now);
+#endif
                        cmd.DesignTimeVisible = true;
                        cmd.CommandTimeout = 100;
                        Object clone1 = ((ICloneable)(cmd)).Clone();
                        SqlCommand cmd1 = (SqlCommand) clone1;
                        Assert.AreEqual(2, cmd1.Parameters.Count);
                        Assert.AreEqual(100, cmd1.CommandTimeout);
-                       cmd1.Parameters.Add("@test", DateTime.Now);
+#if NET_2_0
+                       cmd1.Parameters.AddWithValue ("@test", DateTime.Now);
+#else
+                       cmd1.Parameters.Add ("@test", DateTime.Now);
+#endif
                        // to check that it is deep copy and not a shallow copy of the
                        // parameter collection
                        Assert.AreEqual(3, cmd1.Parameters.Count);
                        Assert.AreEqual(2, cmd.Parameters.Count);
                }
 
+               [Test]
+               public void StoredProc_NoParameterTest ()
+               {
+                       string query = "create procedure #tmp_sp_proc as begin";
+                       query += " select 'data' end";
+                       SqlConnection conn = new SqlConnection (connectionString);
+                       SqlCommand cmd = conn.CreateCommand ();
+                       cmd.CommandText = query ;
+                       conn.Open ();
+                       cmd.ExecuteNonQuery ();
+       
+                       cmd.CommandType = CommandType.StoredProcedure;
+                       cmd.CommandText = "#tmp_sp_proc";
+                       using (SqlDataReader reader = cmd.ExecuteReader()) {
+                               if (reader.Read ())
+                                       Assert.AreEqual ("data", reader.GetString(0),"#1");
+                               else
+                                       Assert.Fail ("#2 Select shud return data");
+                       }
+                       conn.Close ();
+               }
+       
+               [Test]
+               public void StoredProc_ParameterTest ()
+               {
+                       string create_query  = CREATE_TMP_SP_PARAM_TEST;
+                       string drop_query = DROP_TMP_SP_PARAM_TEST;
+
+                       SqlConnection conn = new SqlConnection (connectionString);
+                       
+                       conn.Open ();
+                       SqlCommand cmd = conn.CreateCommand ();
+                       int label = 0 ;
+                       string error = "";
+                       while (label != -1) {
+                               try {
+                                       switch (label) {
+                                               case 0 :
+                                                       // Test BigInt Param    
+                                                       DBHelper.ExecuteNonQuery (conn,
+                                                                       String.Format(create_query, "bigint"));
+                                                       rpc_helper_function (cmd, SqlDbType.BigInt, 0, Int64.MaxValue);
+                                                       rpc_helper_function (cmd, SqlDbType.BigInt, 0, Int64.MinValue);
+                                                       break;
+                                               case 1 :
+                                                       // Test Binary Param 
+                                                       DBHelper.ExecuteNonQuery (conn,
+                                                                       String.Format(create_query, "binary(5)"));
+                                                       //rpc_helper_function (cmd, SqlDbType.Binary, 0, new byte[] {});
+                                                       rpc_helper_function (cmd, SqlDbType.Binary, 5, new byte[] {1,2,3,4,5});
+                                                       break;
+                                               case 2 :
+                                                       // Test Bit Param
+                                                       DBHelper.ExecuteNonQuery (conn,
+                                                                       String.Format(create_query, "bit"));
+                                                       rpc_helper_function (cmd, SqlDbType.Bit, 0, true);
+                                                       rpc_helper_function (cmd, SqlDbType.Bit, 0, false);
+                                                       break;
+                                               case 3 :
+                                                       // Testing Char 
+                                                       DBHelper.ExecuteNonQuery (conn,
+                                                                       String.Format(create_query, "char(10)"));
+                                                       rpc_helper_function (cmd, SqlDbType.Char, 10, "characters");
+                                                       /*
+                                                       rpc_helper_function (cmd, SqlDbType.Char, 10, "");
+                                                       rpc_helper_function (cmd, SqlDbType.Char, 10, null);
+                                                       */
+                                                       break;
+                                               case 4 :
+                                                       // Testing DateTime
+                                                       DBHelper.ExecuteNonQuery (conn,
+                                                                       String.Format(create_query, "datetime"));
+                                                       rpc_helper_function (cmd, SqlDbType.DateTime, 0, "2079-06-06 23:59:00");
+                                                       /*
+                                                       rpc_helper_function (cmd, SqlDbType.DateTime, 10, "");
+                                                       rpc_helper_function (cmd, SqlDbType.DateTime, 10, null);
+                                                       */
+                                                       break;
+                                               case 5 :
+                                                       // Test Decimal Param
+                                                       DBHelper.ExecuteNonQuery (conn, 
+                                                                       String.Format(create_query,"decimal(10,2)"));
+                                                       /*
+                                                       rpc_helper_function (cmd, SqlDbType.Decimal, 0, 10.01);
+                                                       rpc_helper_function (cmd, SqlDbType.Decimal, 0, -10.01);
+                                                       */
+                                                       break;
+                                               case 6 :
+                                                       // Test Float Param
+                                                       DBHelper.ExecuteNonQuery (conn, 
+                                                                       String.Format(create_query,"float"));
+                                                       rpc_helper_function (cmd, SqlDbType.Float, 0, 10.0);
+                                                       rpc_helper_function (cmd, SqlDbType.Float, 0, 0);
+                                                       /*
+                                                       rpc_helper_function (cmd, SqlDbType.Float, 0, null);
+                                                       */
+                                                       break;
+                                               case 7 :
+                                                       // Testing Image
+                                                       /* NOT WORKING
+                                                          DBHelper.ExecuteNonQuery (conn,
+                                                          String.Format(create_query, "image"));
+                                                          rpc_helper_function (cmd, SqlDbType.Image, 0, );
+                                                          rpc_helper_function (cmd, SqlDbType.Image, 0, );
+                                                          rpc_helper_function (cmd, SqlDbType.Image, 0, );
+                                                          /* NOT WORKING*/
+                                                       break;
+                                               case 8 :
+                                                       // Test Integer Param   
+                                                       DBHelper.ExecuteNonQuery (conn,
+                                                       String.Format(create_query,"int"));
+                                                       rpc_helper_function (cmd, SqlDbType.Int, 0, 10);
+                                                       /*
+                                                       rpc_helper_function (cmd, SqlDbType.Int, 0, null);
+                                                       */
+                                                       break;
+                                               case 9 :
+                                                       // Test Money Param     
+                                                       DBHelper.ExecuteNonQuery (conn,
+                                                                       String.Format(create_query,"money"));
+                                                       /*
+                                                       rpc_helper_function (cmd, SqlDbType.Money, 0, 10.0);
+                                                       rpc_helper_function (cmd, SqlDbType.Money, 0, null);
+                                                       */
+                                                       break;
+                                               case 23 :
+                                                       // Test NChar Param     
+                                                       DBHelper.ExecuteNonQuery (conn,
+                                                                       String.Format(create_query,"nchar(10)"));
+                                                       /*
+                                                       rpc_helper_function (cmd, SqlDbType.NChar, 10, "nchar");
+                                                       rpc_helper_function (cmd, SqlDbType.NChar, 10, "");
+                                                       rpc_helper_function (cmd, SqlDbType.NChar, 10, null); 
+                                                       */
+                                                       break;
+                                               case 10 :
+                                                       // Test NText Param     
+                                                       DBHelper.ExecuteNonQuery (conn,
+                                                                       String.Format(create_query,"ntext"));
+                                                       /*
+                                                       rpc_helper_function (cmd, SqlDbType.NText, 0, "ntext");
+                                                       rpc_helper_function (cmd, SqlDbType.NText, 0, "");
+                                                       rpc_helper_function (cmd, SqlDbType.NText, 0, null); 
+                                                       */
+                                                       break;
+                                               case 11 :
+                                                       // Test NVarChar Param  
+                                                       DBHelper.ExecuteNonQuery (conn,
+                                                                       String.Format(create_query,"nvarchar(10)"));
+                                                       rpc_helper_function (cmd, SqlDbType.NVarChar, 10, "nvarchar");
+                                                       rpc_helper_function (cmd, SqlDbType.NVarChar, 10, "");
+                                                       //rpc_helper_function (cmd, SqlDbType.NVarChar, 10, null); 
+                                                       break;
+                                               case 12 :
+                                                       // Test Real Param      
+                                                       DBHelper.ExecuteNonQuery (conn,
+                                                       String.Format(create_query,"real"));
+                                                       rpc_helper_function (cmd, SqlDbType.Real, 0, 10.0);
+                                                       //rpc_helper_function (cmd, SqlDbType.Real, 0, null); 
+                                                       break;
+                                               case 13 :
+                                                       // Test SmallDateTime Param     
+                                                       DBHelper.ExecuteNonQuery (conn,
+                                                                       String.Format(create_query,"smalldatetime"));
+                                                       rpc_helper_function (cmd, SqlDbType.SmallDateTime, 0, "6/6/2079 11:59:00 PM");
+                                                       /*
+                                                       rpc_helper_function (cmd, SqlDbType.SmallDateTime, 0, "");
+                                                       rpc_helper_function (cmd, SqlDbType.SmallDateTime, 0, null);
+                                                       */
+                                                       break;
+                                               case 14 :
+                                                       // Test SmallInt Param  
+                                                       DBHelper.ExecuteNonQuery (conn,
+                                                       String.Format(create_query,"smallint"));
+                                                       rpc_helper_function (cmd, SqlDbType.SmallInt, 0, 10);
+                                                       rpc_helper_function (cmd, SqlDbType.SmallInt, 0, -10);
+                                                       //rpc_helper_function (cmd, SqlDbType.SmallInt, 0, null);
+                                                       break;
+                                               case 15 :
+                                                       // Test SmallMoney Param        
+                                                       DBHelper.ExecuteNonQuery (conn,
+                                                                       String.Format(create_query,"smallmoney"));
+                                                       /*
+                                                       rpc_helper_function (cmd, SqlDbType.SmallMoney, 0, 10.0);
+                                                       rpc_helper_function (cmd, SqlDbType.SmallMoney, 0, -10.0);
+                                                       rpc_helper_function (cmd, SqlDbType.SmallMoney, 0, null);
+                                                       */
+                                                       break;
+                                               case 16 :
+                                                       // Test Text Param      
+                                                       DBHelper.ExecuteNonQuery (conn,
+                                                                       String.Format(create_query,"text"));
+                                                       /*
+                                                       rpc_helper_function (cmd, SqlDbType.Text, 0, "text");
+                                                       rpc_helper_function (cmd, SqlDbType.Text, 0, "");
+                                                       rpc_helper_function (cmd, SqlDbType.Text, 0, null);
+                                                       */
+                                                       break;
+                                               case 17 :
+                                                       // Test TimeStamp Param 
+                                                       /* NOT WORKING
+                                                          DBHelper.ExecuteNonQuery (conn,
+                                                          String.Format(create_query,"timestamp"));
+                                                          rpc_helper_function (cmd, SqlDbType.TimeStamp, 0, "");
+                                                          rpc_helper_function (cmd, SqlDbType.TimeStamp, 0, "");
+                                                          rpc_helper_function (cmd, SqlDbType.TimeStamp, 0, null); 
+                                                        */
+                                                       break;
+                                               case 18 :
+                                                       // Test TinyInt Param   
+                                                       DBHelper.ExecuteNonQuery (conn,
+                                                                       String.Format(create_query,"tinyint"));
+                                                       /*
+                                                       rpc_helper_function (cmd, SqlDbType.TinyInt, 0, 10);
+                                                       rpc_helper_function (cmd, SqlDbType.TinyInt, 0, -10);
+                                                       rpc_helper_function (cmd, SqlDbType.TinyInt, 0, null);
+                                                       */
+                                                       break;
+                                               case 19 :
+                                                       // Test UniqueIdentifier Param  
+                                                       /*
+                                                       DBHelper.ExecuteNonQuery (conn,
+                                                                       String.Format(create_query,"uniqueidentifier"));
+                                                       rpc_helper_function (cmd, SqlDbType.UniqueIdentifier, 0, "0f159bf395b1d04f8c2ef5c02c3add96");
+                                                       rpc_helper_function (cmd, SqlDbType.UniqueIdentifier, 0, null); 
+                                                       */
+                                                       break;
+                                               case 20 :
+                                                       // Test VarBinary Param 
+                                                       /* NOT WORKING
+                                                          DBHelper.ExecuteNonQuery (conn,
+                                                          String.Format(create_query,"varbinary (10)"));
+                                                          rpc_helper_function (cmd, SqlDbType.VarBinary, 0,);
+                                                          rpc_helper_function (cmd, SqlDbType.VarBinary, 0,);
+                                                          rpc_helper_function (cmd, SqlDbType.VarBinary, 0, null); 
+                                                        */
+                                                       break;
+                                               case 21 :
+                                                       // Test Varchar Param
+                                                       DBHelper.ExecuteNonQuery (conn,
+                                                                       String.Format(create_query,"varchar(10)"));
+                                                       rpc_helper_function (cmd, SqlDbType.VarChar, 10, "VarChar");
+                                                       break;
+                                               case 22 :
+                                                       // Test Variant Param   
+                                                       /* NOT WORKING
+                                                          DBHelper.ExecuteNonQuery (conn,
+                                                          String.Format(create_query,"variant"));
+                                                          rpc_helper_function (cmd, SqlDbType.Variant, 0, );
+                                                          rpc_helper_function (cmd, SqlDbType.Variant, 0, );
+                                                          rpc_helper_function (cmd, SqlDbType.Variant, 0, null); 
+                                                        */
+                                                       break; 
+                                               default :
+                                                       label = -2;
+                                                       break; 
+                                       }
+                               }catch (AssertionException e) {
+                                       error += String.Format (" Case {0} INCORRECT VALUE : {1}\n",label, e.Message);
+                               }catch (Exception e) {
+                                       error += String.Format (" Case {0} NOT WORKING : {1}\n",label, e.Message);
+                               }
+
+                               label++;
+                               if (label != -1)
+                                       DBHelper.ExecuteNonQuery (conn, drop_query);
+                       }
+                       if (error != String.Empty)
+                               Assert.Fail (error);
+               }
+
+               private void rpc_helper_function (SqlCommand cmd, SqlDbType type, int size, object val)
+               {
+                               cmd.Parameters.Clear ();
+                               SqlParameter param1 ;
+                               SqlParameter param2 ;
+                               if (size != 0) {
+                                       param1 = new SqlParameter ("@param1", type, size);
+                                       param2 = new SqlParameter ("@param2", type, size);
+                               }
+                               else {
+                                       param1 = new SqlParameter ("@param1", type);
+                                       param2 = new SqlParameter ("@param2", type);
+                               }
+
+                               SqlParameter retval = new SqlParameter ("retval", SqlDbType.Int);
+                               param1.Value = val;
+                               param1.Direction = ParameterDirection.Input;
+                               param2.Direction = ParameterDirection.Output;
+                               retval.Direction = ParameterDirection.ReturnValue;
+                               cmd.Parameters.Add (param1);
+                               cmd.Parameters.Add (param2);
+                               cmd.Parameters.Add (retval);
+                               cmd.CommandText = "#tmp_sp_param_test";
+                               cmd.CommandType = CommandType.StoredProcedure;
+                               using (SqlDataReader reader = cmd.ExecuteReader ()) {
+                                       while (reader.Read ()) {
+                                               if (param1.Value != null && param1.Value.GetType () == typeof (string))
+                                                       Assert.AreEqual (param1.Value,
+                                                                        reader.GetValue(0).ToString (),"#1");
+                                               else
+                                                       Assert.AreEqual (param1.Value,
+                                                                        reader.GetValue(0),"#1");
+                                       }
+                               }
+                               if (param1.Value != null && param1.Value.GetType () == typeof (string) && param2.Value != null)
+                                       Assert.AreEqual (param1.Value.ToString (), param2.Value.ToString (), "#2");
+                               else
+                                       Assert.AreEqual (param1.Value, param2.Value, "#2");
+                               Assert.AreEqual (5, retval.Value, "#3");
+               }
+
+               [Test]
+               [ExpectedException (typeof (InvalidOperationException))]
+               public void OutputParamSizeTest1 ()
+               {
+                       conn = (SqlConnection) ConnectionManager.Singleton.Connection;
+                       ConnectionManager.Singleton.OpenConnection ();
+                       cmd = new SqlCommand ();
+                       cmd.Connection = conn;
+
+                       cmd.CommandText = "create procedure #testsize (@p1 as varchar(10) output) as return";
+                       cmd.CommandType = CommandType.Text;
+                       cmd.ExecuteNonQuery ();
+
+                       cmd.CommandText = "#testsize";
+                       cmd.CommandType = CommandType.StoredProcedure;
+
+                       SqlParameter p1 = new SqlParameter ();
+                       p1.ParameterName = "@p1";
+                       p1.Direction = ParameterDirection.InputOutput;
+                       p1.DbType = DbType.String;
+                       p1.IsNullable = false;
+                       cmd.Parameters.Add (p1);
+                       cmd.ExecuteNonQuery ();
+               }
+
+               [Test]
+               [ExpectedException (typeof (InvalidOperationException))]
+               public void OutputParamSizeTest2 ()
+               {
+                       conn = (SqlConnection) ConnectionManager.Singleton.Connection;
+                       ConnectionManager.Singleton.OpenConnection ();
+                       cmd = new SqlCommand ();
+                       cmd.Connection = conn;
+
+                       cmd.CommandText = "create procedure #testsize (@p1 as varchar(10) output) as return";
+                       cmd.CommandType = CommandType.Text;
+                       cmd.ExecuteNonQuery ();
+
+                       cmd.CommandText = "#testsize";
+                       cmd.CommandType = CommandType.StoredProcedure;
+
+                       SqlParameter p1 = new SqlParameter ();
+                       p1.ParameterName = "@p1";
+                       p1.Direction = ParameterDirection.Output;
+                       p1.DbType = DbType.String;
+                       p1.IsNullable = false;
+                       cmd.Parameters.Add (p1);
+                       cmd.ExecuteNonQuery ();
+               }
+
+               [Test]
+               [ExpectedException (typeof (InvalidOperationException))]
+               public void OutputParamSizeTest3 ()
+               {
+                       conn = (SqlConnection) ConnectionManager.Singleton.Connection;
+                       ConnectionManager.Singleton.OpenConnection ();
+                       cmd = new SqlCommand ();
+                       cmd.Connection = conn;
+
+                       cmd.CommandText = "create procedure #testsize (@p1 as varchar(10) output) as return";
+                       cmd.CommandType = CommandType.Text;
+                       cmd.ExecuteNonQuery ();
+
+                       cmd.CommandText = "#testsize";
+                       cmd.CommandType = CommandType.StoredProcedure;
+
+                       SqlParameter p1 = new SqlParameter ();
+                       p1.ParameterName = "@p1";
+                       p1.Direction = ParameterDirection.InputOutput;
+                       p1.DbType = DbType.String;
+                       p1.IsNullable = true;
+                       cmd.Parameters.Add (p1);
+                       cmd.ExecuteNonQuery ();
+               }
+
+               [Test]
+               [ExpectedException (typeof (InvalidOperationException))]
+               public void OutputParamSizeTest4 ()
+               {
+                       conn = (SqlConnection) ConnectionManager.Singleton.Connection;
+                       ConnectionManager.Singleton.OpenConnection ();
+                       cmd = new SqlCommand ();
+                       cmd.Connection = conn;
+
+                       cmd.CommandText = "create procedure #testsize (@p1 as varchar(10) output) as return";
+                       cmd.CommandType = CommandType.Text;
+                       cmd.ExecuteNonQuery ();
+
+                       cmd.CommandText = "#testsize";
+                       cmd.CommandType = CommandType.StoredProcedure;
+
+                       SqlParameter p1 = new SqlParameter ();
+                       p1.ParameterName = "@p1";
+                       p1.Direction = ParameterDirection.Output;
+                       p1.DbType = DbType.String;
+                       p1.IsNullable = true;
+                       cmd.Parameters.Add (p1);
+                       cmd.ExecuteNonQuery ();
+               }
+
+#if NET_2_0 
+               [Test]
+               public void NotificationTest () 
+               {
+                       cmd = new SqlCommand ();
+                       SqlNotificationRequest notification = new SqlNotificationRequest("MyNotification","MyService",15);
+                       Assert.AreEqual (null, cmd.Notification, "#1 The default value for this property should be null");
+                       cmd.Notification = notification;
+                       Assert.AreEqual ("MyService", cmd.Notification.Options, "#2 The value should be MyService as the constructor is initiated with this value");
+                       Assert.AreEqual (15, cmd.Notification.Timeout, "#2 The value should be 15 as the constructor is initiated with this value");
+               }
+
+               [Test]
+               public void NotificationAutoEnlistTest () 
+               {
+                       cmd = new SqlCommand ();
+                       Assert.AreEqual (true, cmd.NotificationAutoEnlist, "#1 Default value of the property should be true");
+                       cmd.NotificationAutoEnlist = false;
+                       Assert.AreEqual (false, cmd.NotificationAutoEnlist, "#2 The value of the property should be false after setting it to false");
+               }
+
+               [Test]          
+               public void BeginExecuteXmlReaderTest ()
+               {
+                       cmd = new SqlCommand ();
+                       string connectionString1 = null;
+                       connectionString1 = ConnectionManager.Singleton.ConnectionString + "Asynchronous Processing=true";
+                       try {
+                               SqlConnection conn1 = new SqlConnection (connectionString1); 
+                               conn1.Open ();
+                               cmd.CommandText = "Select lname from employee where id<2 FOR XML AUTO, XMLDATA" ;
+                               cmd.Connection = conn1;
+                       
+                               IAsyncResult result = cmd.BeginExecuteXmlReader ();
+                               XmlReader reader = cmd.EndExecuteXmlReader (result);
+                               while (reader.Read ())
+                               {
+                                       if (reader.LocalName.ToString () == "employee")
+                                       {
+                                               Assert.AreEqual ("kumar", reader["lname"], "#1 ");
+                                       }
+                               }
+                       } finally {
+                               ConnectionManager.Singleton.CloseConnection ();
+                       }
+               }
+               
+               [Test]
+               public void BeginExecuteXmlReaderExceptionTest ()
+               {
+                       cmd = new SqlCommand ();
+                       try {
+                               SqlConnection conn = new SqlConnection (connectionString); 
+                               conn.Open ();
+                               cmd.CommandText = "Select lname from employee where id<2 FOR XML AUTO, XMLDATA" ;
+                               cmd.Connection = conn;
+                               
+                               try {
+                                       /*IAsyncResult result = */cmd.BeginExecuteXmlReader ();
+                               } catch (InvalidOperationException) {
+                                       Assert.AreEqual (ConnectionManager.Singleton.ConnectionString, connectionString, "#1 Connection string has changed");
+                                       return;
+                               }
+                               Assert.Fail ("Expected Exception InvalidOperationException not thrown");
+                       } finally {
+                               ConnectionManager.Singleton.CloseConnection ();
+                       }               
+               }
+               
+               [Test]
+               public void SqlCommandDisposeTest ()
+               {
+                       IDataReader reader = null;
+                       try {
+                               conn = (SqlConnection) ConnectionManager.Singleton.Connection;
+                               ConnectionManager.Singleton.OpenConnection ();
+
+                               IDbCommand command = conn.CreateCommand ();
+                               try {
+                                       string sql = "SELECT * FROM employee";
+                                       command.CommandText = sql;
+                                       reader = command.ExecuteReader();
+                               } finally {
+                                       command.Dispose();
+                               }
+                               while (reader.Read());
+                       } finally {
+                               reader.Dispose();
+                               ConnectionManager.Singleton.CloseConnection ();
+                       }               
+               }
+               
+               [Test]
+               public void CloneObjTest ()
+               {
+                       SqlCommand cmd = new SqlCommand();
+                       cmd.CommandText = "sp_insert";
+                       cmd.CommandType = CommandType.StoredProcedure;
+                       Object TestPar = DBNull.Value;
+                       cmd.Parameters.Add ("@TestPar1", SqlDbType.Int);
+                       cmd.Parameters ["@TestPar1"].Value = TestPar;
+#if NET_2_0
+                       cmd.Parameters.AddWithValue ("@BirthDate", DateTime.Now);
+#else
+                       cmd.Parameters.Add ("@BirthDate", DateTime.Now);
+#endif
+                       cmd.DesignTimeVisible = true;
+                       cmd.CommandTimeout = 100;
+                       SqlCommand cmd1 = cmd.Clone ();
+                       Assert.AreEqual (2, cmd1.Parameters.Count);
+                       Assert.AreEqual (100, cmd1.CommandTimeout);
+#if NET_2_0
+                       cmd1.Parameters.AddWithValue ("@test", DateTime.Now);
+#else
+                       cmd1.Parameters.Add ("@test", DateTime.Now);
+#endif
+                       Assert.AreEqual (3, cmd1.Parameters.Count);
+                       Assert.AreEqual (2, cmd.Parameters.Count);
+               }
+#endif
+
                private enum Status { 
                        OK = 0,
                        Error = 3
                }
 
+               private readonly string CREATE_TMP_SP_PARAM_TEST = "create procedure #tmp_sp_param_test (@param1 {0}, @param2 {0} output) as begin select @param1 set @param2=@param1 return 5 end";
+               private readonly string DROP_TMP_SP_PARAM_TEST = "drop procedure #tmp_sp_param_test";
+
                private readonly string CREATE_TMP_SP_TEMP_INSERT_PERSON = ("create procedure #sp_temp_insert_employee ( " + Environment.NewLine + 
                                                                            "@fname varchar (20)) " + Environment.NewLine + 
                                                                            "as " + Environment.NewLine +