<29/05/07 by:yoni yonik@mainsoft.com>
[mono.git] / mcs / class / System.Web / Test / System.Web.UI.WebControls / SqlDataSourceTest.cs
index 146438c3e3b83ca8cdd1b22f13922d24772499bf..9c2e62598fd40b8a2cb1e736322c7d751c60d8b3 100644 (file)
-//
-// Tests for System.Web.UI.WebControls.SqlDataSource
-//
-// Author:
-//     Chris Toshok (toshok@novell.com)
-//
-
-//
-// Copyright (C) 2005 Novell, Inc (http://www.novell.com)
-//
-// Permission is hereby granted, free of charge, to any person obtaining
-// a copy of this software and associated documentation files (the
-// "Software"), to deal in the Software without restriction, including
-// without limitation the rights to use, copy, modify, merge, publish,
-// distribute, sublicense, and/or sell copies of the Software, and to
-// permit persons to whom the Software is furnished to do so, subject to
-// the following conditions:
-// 
-// The above copyright notice and this permission notice shall be
-// included in all copies or substantial portions of the Software.
-// 
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-//
-
-#if NET_2_0
-
-using NUnit.Framework;
-using System;
-using System.Configuration;
-using System.Data.Common;
-using System.IO;
-using System.Globalization;
-using System.Web;
-using System.Web.UI;
-using System.Web.UI.WebControls;
-
-namespace MonoTests.System.Web.UI.WebControls
-{
-       class SqlPoker : SqlDataSource {
-               public SqlPoker ()
-               {
-                       TrackViewState ();
-               }
-
-               public object SaveToViewState ()
-               {
-                       return SaveViewState ();
-               }
-
-               public void LoadFromViewState (object savedState)
-               {
-                       LoadViewState (savedState);
-               }
-       }
-
-       [TestFixture]
-       public class SqlDataSourceTest {
-               [Test]
-               public void Defaults ()
-               {
-                       SqlPoker sql = new SqlPoker ();
-
-                       Assert.AreEqual ("", sql.CacheKeyDependency, "A1");
-                       Assert.IsTrue (sql.CancelSelectOnNullParameter, "A2");
-                       Assert.AreEqual (ConflictOptions.OverwriteChanges, sql.ConflictDetection, "A3");
-                       Assert.AreEqual (SqlDataSourceCommandType.StoredProcedure, sql.DeleteCommandType, "A4");
-                       Assert.AreEqual (SqlDataSourceCommandType.StoredProcedure, sql.InsertCommandType, "A5");
-                       Assert.AreEqual (SqlDataSourceCommandType.StoredProcedure, sql.SelectCommandType, "A6");
-                       Assert.AreEqual (SqlDataSourceCommandType.StoredProcedure, sql.UpdateCommandType, "A7");
-                       Assert.AreEqual ("{0}", sql.OldValuesParameterFormatString, "A8");
-                       Assert.AreEqual ("", sql.SqlCacheDependency, "A9");
-                       Assert.AreEqual ("", sql.SortParameterName, "A10");
-                       Assert.AreEqual (0, sql.CacheDuration, "A11");
-                       Assert.AreEqual (DataSourceCacheExpiry.Absolute, sql.CacheExpirationPolicy, "A12");
-                       Assert.IsFalse (sql.EnableCaching, "A13");
-                       Assert.AreEqual ("", sql.ProviderName, "A14");
-                       Assert.AreEqual ("", sql.ConnectionString, "A15");
-                       Assert.AreEqual (SqlDataSourceMode.DataSet, sql.DataSourceMode, "A16");
-                       Assert.AreEqual ("", sql.DeleteCommand, "A17");
-                       Assert.IsNotNull (sql.DeleteParameters, "A18");
-                       Assert.AreEqual (0, sql.DeleteParameters.Count, "A18.1");
-                       Assert.IsNotNull (sql.FilterParameters, "A19");
-                       Assert.AreEqual (0, sql.FilterParameters.Count, "A19.1");
-                       Assert.AreEqual ("", sql.InsertCommand, "A20");
-                       Assert.IsNotNull (sql.InsertParameters, "A21");
-                       Assert.AreEqual (0, sql.InsertParameters.Count, "A21.1");
-                       Assert.AreEqual ("", sql.SelectCommand, "A22");
-                       Assert.IsNotNull (sql.SelectParameters, "A23");
-                       Assert.AreEqual (0, sql.SelectParameters.Count, "A23.1");
-                       Assert.AreEqual ("", sql.UpdateCommand, "A24");
-                       Assert.IsNotNull (sql.UpdateParameters, "A25");
-                       Assert.AreEqual (0, sql.UpdateParameters.Count, "A25.1");
-                       Assert.AreEqual ("", sql.FilterExpression, "A26");
-               }
-
-               [Test]
-               public void ViewState ()
-               {
-                       SqlPoker sql = new SqlPoker ();
-
-                       sql.CacheKeyDependency = "hi";
-                       sql.CancelSelectOnNullParameter = false;
-                       sql.ConflictDetection = ConflictOptions.CompareAllValues;
-                       sql.DeleteCommandType = SqlDataSourceCommandType.Text;
-                       sql.InsertCommandType = SqlDataSourceCommandType.Text;
-                       sql.SelectCommandType = SqlDataSourceCommandType.Text;
-                       sql.UpdateCommandType = SqlDataSourceCommandType.Text;
-                       sql.OldValuesParameterFormatString = "{1}";
-                       sql.SqlCacheDependency = "hi";
-                       sql.SortParameterName = "hi";
-                       sql.CacheDuration = 1;
-                       sql.CacheExpirationPolicy = DataSourceCacheExpiry.Sliding;
-                       sql.EnableCaching = true;
-                       sql.DataSourceMode = SqlDataSourceMode.DataReader;
-                       sql.DeleteCommand = "DELETE foo";
-                       sql.InsertCommand = "INSERT foo";
-                       sql.SelectCommand = "SELECT foo";
-                       sql.UpdateCommand = "UPDATE foo";
-                       sql.FilterExpression = "hi";
-                       
-                       Assert.AreEqual ("hi", sql.CacheKeyDependency, "A1");
-                       Assert.IsFalse (sql.CancelSelectOnNullParameter, "A2");
-                       Assert.AreEqual (ConflictOptions.CompareAllValues, sql.ConflictDetection, "A3");
-                       Assert.AreEqual (SqlDataSourceCommandType.Text, sql.DeleteCommandType, "A4");
-                       Assert.AreEqual (SqlDataSourceCommandType.Text, sql.InsertCommandType, "A5");
-                       Assert.AreEqual (SqlDataSourceCommandType.Text, sql.SelectCommandType, "A6");
-                       Assert.AreEqual (SqlDataSourceCommandType.Text, sql.UpdateCommandType, "A7");
-                       Assert.AreEqual ("{1}", sql.OldValuesParameterFormatString, "A8");
-                       Assert.AreEqual ("hi", sql.SqlCacheDependency, "A9");
-                       Assert.AreEqual ("hi", sql.SortParameterName, "A10");
-                       Assert.AreEqual (1, sql.CacheDuration, "A11");
-                       Assert.AreEqual (DataSourceCacheExpiry.Sliding, sql.CacheExpirationPolicy, "A12");
-                       Assert.IsTrue (sql.EnableCaching, "A13");
-                       Assert.AreEqual (SqlDataSourceMode.DataReader, sql.DataSourceMode, "A16");
-                       Assert.AreEqual ("DELETE foo", sql.DeleteCommand, "A17");
-                       Assert.AreEqual ("INSERT foo", sql.InsertCommand, "A20");
-                       Assert.AreEqual ("SELECT foo", sql.SelectCommand, "A22");
-                       Assert.AreEqual ("UPDATE foo", sql.UpdateCommand, "A24");
-                       Assert.AreEqual ("hi", sql.FilterExpression, "A26");
-
-                       object state = sql.SaveToViewState();
-
-                       sql = new SqlPoker ();
-                       sql.LoadFromViewState (state);
-
-                       Assert.AreEqual ("hi", sql.CacheKeyDependency, "B1");
-                       Assert.IsFalse  (sql.CancelSelectOnNullParameter, "B2");
-                       Assert.AreEqual (ConflictOptions.CompareAllValues, sql.ConflictDetection, "B3");
-                       Assert.AreEqual (SqlDataSourceCommandType.Text, sql.DeleteCommandType, "B4");
-                       Assert.AreEqual (SqlDataSourceCommandType.Text, sql.InsertCommandType, "B5");
-                       Assert.AreEqual (SqlDataSourceCommandType.Text, sql.SelectCommandType, "B6");
-                       Assert.AreEqual (SqlDataSourceCommandType.Text, sql.UpdateCommandType, "B7");
-                       Assert.AreEqual ("{1}", sql.OldValuesParameterFormatString, "B8");
-                       Assert.AreEqual ("hi", sql.SqlCacheDependency, "B9");
-                       Assert.AreEqual ("hi", sql.SortParameterName, "B10");
-                       Assert.AreEqual (1, sql.CacheDuration, "B11");
-                       Assert.AreEqual (DataSourceCacheExpiry.Sliding, sql.CacheExpirationPolicy, "B12");
-                       Assert.IsTrue   (sql.EnableCaching, "B13");
-                       Assert.AreEqual (SqlDataSourceMode.DataReader, sql.DataSourceMode, "B16");
-                       Assert.AreEqual ("DELETE foo", sql.DeleteCommand, "B17");
-                       Assert.AreEqual ("INSERT foo", sql.InsertCommand, "B20");
-                       Assert.AreEqual ("SELECT foo", sql.SelectCommand, "B22");
-                       Assert.AreEqual ("UPDATE foo", sql.UpdateCommand, "B24");
-                       Assert.AreEqual ("hi", sql.FilterExpression, "B26");
-               }
-       }
-
-}
-
-#endif
+//\r
+// Tests for System.Web.UI.WebControls.SqlDataSource\r
+//\r
+// Author:\r
+//     Chris Toshok (toshok@novell.com)\r
+//\r
+\r
+//\r
+// Copyright (C) 2005 Novell, Inc (http://www.novell.com)\r
+//\r
+// Permission is hereby granted, free of charge, to any person obtaining\r
+// a copy of this software and associated documentation files (the\r
+// "Software"), to deal in the Software without restriction, including\r
+// without limitation the rights to use, copy, modify, merge, publish,\r
+// distribute, sublicense, and/or sell copies of the Software, and to\r
+// permit persons to whom the Software is furnished to do so, subject to\r
+// the following conditions:\r
+// \r
+// The above copyright notice and this permission notice shall be\r
+// included in all copies or substantial portions of the Software.\r
+// \r
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,\r
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\r
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\r
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\r
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\r
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\r
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r
+//\r
+\r
+#if NET_2_0\r
+\r
+using NUnit.Framework;\r
+using System;\r
+using System.Configuration;\r
+using System.Data.Common;\r
+using System.Data.SqlClient;\r
+using System.IO;\r
+using System.Globalization;\r
+using System.Web;\r
+using System.Web.UI;\r
+using System.Web.UI.WebControls;\r
+using System.Collections;\r
+using System.Text;\r
+using System.Data;\r
+\r
+namespace MonoTests.System.Web.UI.WebControls\r
+{\r
+       class SqlPoker : SqlDataSource\r
+       {\r
+               public SqlPoker ()\r
+               {\r
+                       TrackViewState ();\r
+               }\r
+\r
+               public object SaveToViewState ()\r
+               {\r
+                       return SaveViewState ();\r
+               }\r
+\r
+               public void LoadFromViewState (object savedState)\r
+               {\r
+                       LoadViewState (savedState);\r
+               }\r
+\r
+               public void DoRaiseDataSourceChangedEvent ()\r
+               {\r
+                       base.RaiseDataSourceChangedEvent(new EventArgs());\r
+               }\r
+       }\r
+\r
+       class CustomSqlDataSourceView : SqlDataSourceView\r
+       {\r
+               public CustomSqlDataSourceView (SqlDataSource owner,string name,HttpContext context):base(owner,name,context)\r
+               {\r
+               }\r
+               \r
+               public new int ExecuteDelete (global::System.Collections.IDictionary keys, global::System.Collections.IDictionary oldValues)\r
+               {\r
+                       return base.ExecuteDelete (keys, oldValues);\r
+               }\r
+\r
+               public new int ExecuteInsert (global::System.Collections.IDictionary values)\r
+               {\r
+                       return base.ExecuteInsert (values);\r
+               }\r
+\r
+               public new global::System.Collections.IEnumerable ExecuteSelect (DataSourceSelectArguments arguments)\r
+               {\r
+                       return base.ExecuteSelect (arguments);\r
+               }\r
+\r
+               public new int ExecuteUpdate (global::System.Collections.IDictionary keys, global::System.Collections.IDictionary values, global::System.Collections.IDictionary oldValues)\r
+               {\r
+                       return base.ExecuteUpdate (keys, values, oldValues);\r
+               }\r
+\r
+               \r
+       }\r
+\r
+       [TestFixture]\r
+       public class SqlDataSourceTest\r
+       {\r
+               [SetUp]\r
+               public void SetUp ()\r
+               {\r
+                       SqlDataSourceTest.CustomEventParameterCollection = null;\r
+                       SqlDataSourceTest.PassedParameters = "";\r
+               }\r
+\r
+               [Test]\r
+               public void Defaults ()\r
+               {\r
+                       SqlPoker sql = new SqlPoker ();\r
+                       Assert.AreEqual ("", sql.CacheKeyDependency, "A1");\r
+                       Assert.IsTrue (sql.CancelSelectOnNullParameter, "A2");\r
+                       Assert.AreEqual (ConflictOptions.OverwriteChanges, sql.ConflictDetection, "A3");\r
+                       Assert.AreEqual (SqlDataSourceCommandType.Text, sql.DeleteCommandType, "A4");\r
+                       Assert.AreEqual (SqlDataSourceCommandType.Text, sql.InsertCommandType, "A5");\r
+                       Assert.AreEqual (SqlDataSourceCommandType.Text, sql.SelectCommandType, "A6");\r
+                       Assert.AreEqual (SqlDataSourceCommandType.Text, sql.UpdateCommandType, "A7");\r
+                       Assert.AreEqual ("{0}", sql.OldValuesParameterFormatString, "A8");\r
+                       Assert.AreEqual ("", sql.SqlCacheDependency, "A9");\r
+                       Assert.AreEqual ("", sql.SortParameterName, "A10");\r
+                       Assert.AreEqual (0, sql.CacheDuration, "A11");\r
+                       Assert.AreEqual (DataSourceCacheExpiry.Absolute, sql.CacheExpirationPolicy, "A12");\r
+                       Assert.IsFalse (sql.EnableCaching, "A13");\r
+                       Assert.AreEqual ("", sql.ProviderName, "A14");\r
+                       Assert.AreEqual ("", sql.ConnectionString, "A15");\r
+                       Assert.AreEqual (SqlDataSourceMode.DataSet, sql.DataSourceMode, "A16");\r
+                       Assert.AreEqual ("", sql.DeleteCommand, "A17");\r
+                       Assert.IsNotNull (sql.DeleteParameters, "A18");\r
+                       Assert.AreEqual (0, sql.DeleteParameters.Count, "A18.1");\r
+                       Assert.IsNotNull (sql.FilterParameters, "A19");\r
+                       Assert.AreEqual (0, sql.FilterParameters.Count, "A19.1");\r
+                       Assert.AreEqual ("", sql.InsertCommand, "A20");\r
+                       Assert.IsNotNull (sql.InsertParameters, "A21");\r
+                       Assert.AreEqual (0, sql.InsertParameters.Count, "A21.1");\r
+                       Assert.AreEqual ("", sql.SelectCommand, "A22");\r
+                       Assert.IsNotNull (sql.SelectParameters, "A23");\r
+                       Assert.AreEqual (0, sql.SelectParameters.Count, "A23.1");\r
+                       Assert.AreEqual ("", sql.UpdateCommand, "A24");\r
+                       Assert.IsNotNull (sql.UpdateParameters, "A25");\r
+                       Assert.AreEqual (0, sql.UpdateParameters.Count, "A25.1");\r
+                       Assert.AreEqual ("", sql.FilterExpression, "A26");\r
+               }\r
+\r
+               [Test]\r
+               public void ViewState ()\r
+               {\r
+                       SqlPoker sql = new SqlPoker ();\r
+\r
+                       sql.CacheKeyDependency = "hi";\r
+                       sql.CancelSelectOnNullParameter = false;\r
+                       sql.ConflictDetection = ConflictOptions.CompareAllValues;\r
+                       sql.DeleteCommandType = SqlDataSourceCommandType.StoredProcedure;\r
+                       sql.InsertCommandType = SqlDataSourceCommandType.StoredProcedure;\r
+                       sql.SelectCommandType = SqlDataSourceCommandType.StoredProcedure;\r
+                       sql.UpdateCommandType = SqlDataSourceCommandType.StoredProcedure;\r
+                       sql.OldValuesParameterFormatString = "{1}";\r
+                       sql.SqlCacheDependency = "hi";\r
+                       sql.SortParameterName = "hi";\r
+                       sql.CacheDuration = 1;\r
+                       sql.CacheExpirationPolicy = DataSourceCacheExpiry.Sliding;\r
+                       sql.EnableCaching = true;\r
+                       sql.DataSourceMode = SqlDataSourceMode.DataReader;\r
+                       sql.DeleteCommand = "DELETE foo";\r
+                       sql.InsertCommand = "INSERT foo";\r
+                       sql.SelectCommand = "SELECT foo";\r
+                       sql.UpdateCommand = "UPDATE foo";\r
+                       sql.FilterExpression = "hi";\r
+\r
+                       Assert.AreEqual ("hi", sql.CacheKeyDependency, "A1");\r
+                       Assert.IsFalse (sql.CancelSelectOnNullParameter, "A2");\r
+                       Assert.AreEqual (ConflictOptions.CompareAllValues, sql.ConflictDetection, "A3");\r
+                       Assert.AreEqual (SqlDataSourceCommandType.StoredProcedure, sql.DeleteCommandType, "A4");\r
+                       Assert.AreEqual (SqlDataSourceCommandType.StoredProcedure, sql.InsertCommandType, "A5");\r
+                       Assert.AreEqual (SqlDataSourceCommandType.StoredProcedure, sql.SelectCommandType, "A6");\r
+                       Assert.AreEqual (SqlDataSourceCommandType.StoredProcedure, sql.UpdateCommandType, "A7");\r
+                       Assert.AreEqual ("{1}", sql.OldValuesParameterFormatString, "A8");\r
+                       Assert.AreEqual ("hi", sql.SqlCacheDependency, "A9");\r
+                       Assert.AreEqual ("hi", sql.SortParameterName, "A10");\r
+                       Assert.AreEqual (1, sql.CacheDuration, "A11");\r
+                       Assert.AreEqual (DataSourceCacheExpiry.Sliding, sql.CacheExpirationPolicy, "A12");\r
+                       Assert.IsTrue (sql.EnableCaching, "A13");\r
+                       Assert.AreEqual (SqlDataSourceMode.DataReader, sql.DataSourceMode, "A16");\r
+                       Assert.AreEqual ("DELETE foo", sql.DeleteCommand, "A17");\r
+                       Assert.AreEqual ("INSERT foo", sql.InsertCommand, "A20");\r
+                       Assert.AreEqual ("SELECT foo", sql.SelectCommand, "A22");\r
+                       Assert.AreEqual ("UPDATE foo", sql.UpdateCommand, "A24");\r
+                       Assert.AreEqual ("hi", sql.FilterExpression, "A26");\r
+\r
+                       object state = sql.SaveToViewState ();\r
+                       Assert.IsNull (state, "ViewState is null");\r
+\r
+                       sql = new SqlPoker ();\r
+                       sql.LoadFromViewState (state);\r
+\r
+                       Assert.AreEqual ("", sql.CacheKeyDependency, "B1");\r
+                       Assert.IsTrue (sql.CancelSelectOnNullParameter, "B2");\r
+                       Assert.AreEqual (ConflictOptions.OverwriteChanges, sql.ConflictDetection, "B3");\r
+                       Assert.AreEqual (SqlDataSourceCommandType.Text, sql.DeleteCommandType, "B4");\r
+                       Assert.AreEqual (SqlDataSourceCommandType.Text, sql.InsertCommandType, "B5");\r
+                       Assert.AreEqual (SqlDataSourceCommandType.Text, sql.SelectCommandType, "B6");\r
+                       Assert.AreEqual (SqlDataSourceCommandType.Text, sql.UpdateCommandType, "B7");\r
+                       Assert.AreEqual ("{0}", sql.OldValuesParameterFormatString, "B8");\r
+                       Assert.AreEqual ("", sql.SqlCacheDependency, "B9");\r
+                       Assert.AreEqual ("", sql.SortParameterName, "B10");\r
+                       Assert.AreEqual (0, sql.CacheDuration, "B11");\r
+                       Assert.AreEqual (DataSourceCacheExpiry.Absolute, sql.CacheExpirationPolicy, "B12");\r
+                       Assert.IsFalse (sql.EnableCaching, "B13");\r
+                       Assert.AreEqual (SqlDataSourceMode.DataSet, sql.DataSourceMode, "B16");\r
+                       Assert.AreEqual ("", sql.DeleteCommand, "B17");\r
+                       Assert.IsNotNull (sql.DeleteParameters, "B18");\r
+                       Assert.AreEqual (0, sql.DeleteParameters.Count, "B18.1");\r
+                       Assert.IsNotNull (sql.FilterParameters, "B19");\r
+                       Assert.AreEqual (0, sql.FilterParameters.Count, "B19.1");\r
+                       Assert.AreEqual ("", sql.InsertCommand, "B20");\r
+                       Assert.IsNotNull (sql.InsertParameters, "B21");\r
+                       Assert.AreEqual (0, sql.InsertParameters.Count, "B21.1");\r
+                       Assert.AreEqual ("", sql.SelectCommand, "B22");\r
+                       Assert.IsNotNull (sql.SelectParameters, "B23");\r
+                       Assert.AreEqual (0, sql.SelectParameters.Count, "B23.1");\r
+                       Assert.AreEqual ("", sql.UpdateCommand, "B24");\r
+                       Assert.IsNotNull (sql.UpdateParameters, "B25");\r
+                       Assert.AreEqual (0, sql.UpdateParameters.Count, "B25.1");\r
+                       Assert.AreEqual ("", sql.FilterExpression, "B26");\r
+               }\r
+\r
+               // Help parameter for Asserts\r
+               private static SqlParameterCollection CustomEventParameterCollection;\r
+               private static string PassedParameters;\r
+\r
+               [Test]\r
+               public void ReturnValueParameter ()\r
+               {\r
+                       SqlPoker sql = new SqlPoker ();\r
+                       sql.ConnectionString = "Data Source=fake\\SQLEXPRESS;Initial Catalog=Northwind;User ID=sa";\r
+                       sql.ProviderName = "System.Data.SqlClient";\r
+                       CustomSqlDataSourceView view = new CustomSqlDataSourceView (sql, "TestView", null);\r
+                       view.SelectCommandType = SqlDataSourceCommandType.Text;\r
+                       view.SelectCommand = "SELECT * FROM products WHERE ProductID = @ProductID;";\r
+                       view.OldValuesParameterFormatString = "origin_{0}";\r
+\r
+                       view.SelectParameters.Add (new Parameter ("ProductID", TypeCode.Int32, "10"));\r
+                       Parameter myReturn = new Parameter ("myReturn", TypeCode.Int32);\r
+                       myReturn.Direction = ParameterDirection.ReturnValue;\r
+                       view.SelectParameters.Add (myReturn);\r
+                       \r
+                       view.Selecting += new SqlDataSourceSelectingEventHandler (view_Selecting);\r
+                       view.Select (new DataSourceSelectArguments ());\r
+                       \r
+                       Assert.IsNotNull (CustomEventParameterCollection, "Select event not fired");\r
+                       Assert.AreEqual (2, CustomEventParameterCollection.Count, "Parameter count");\r
+                       Assert.IsNotNull (CustomEventParameterCollection ["@myReturn"], "Parameter name");\r
+               }\r
+               \r
+               [Test]\r
+               public void ExecuteSelect ()\r
+               {\r
+                       SqlPoker sql = new SqlPoker();\r
+                       sql.ConnectionString = "Data Source=fake\\SQLEXPRESS;Initial Catalog=Northwind;User ID=sa";\r
+                       sql.ProviderName = "System.Data.SqlClient";\r
+                       CustomSqlDataSourceView view = new CustomSqlDataSourceView (sql, "TestView", null);\r
+                       view.SelectCommandType = SqlDataSourceCommandType.Text;\r
+                       view.SelectCommand = "SELECT * FROM products WHERE ProductID = @ProductID;";\r
+                       view.OldValuesParameterFormatString = "origin_{0}";\r
+               \r
+                       view.SelectParameters.Add (new Parameter ("ProductID", TypeCode.Int32, "10"));\r
+                       view.Selecting += new SqlDataSourceSelectingEventHandler (view_Selecting);\r
+                       view.Select (new DataSourceSelectArguments ());\r
+                       Assert.IsNotNull (CustomEventParameterCollection, "Select event not fired");\r
+                       Assert.AreEqual (1, CustomEventParameterCollection.Count, "Parameter count");\r
+                       Assert.AreEqual ("@ProductID", CustomEventParameterCollection[0].ParameterName, "Parameter name");\r
+                       Assert.AreEqual (10, CustomEventParameterCollection[0].Value, "Parameter value");\r
+               }\r
+\r
+               [Test]\r
+               public void ExecuteSelect2 () \r
+               {\r
+                       SqlPoker sql = new SqlPoker ();\r
+                       sql.ConnectionString = "Data Source=fake\\SQLEXPRESS;Initial Catalog=Northwind;User ID=sa";\r
+                       sql.ProviderName = "System.Data.SqlClient";\r
+                       sql.DataSourceMode = SqlDataSourceMode.DataReader;\r
+                       CustomSqlDataSourceView view = new CustomSqlDataSourceView (sql, "TestView", null);\r
+                       view.SelectCommandType = SqlDataSourceCommandType.Text;\r
+                       view.SelectCommand = "SELECT * FROM products WHERE ProductID = @ProductID;";\r
+                       view.OldValuesParameterFormatString = "origin_{0}";\r
+\r
+                       view.SelectParameters.Add (new Parameter ("ProductID", TypeCode.Int32, "10"));\r
+                       view.Selecting += new SqlDataSourceSelectingEventHandler (view_Selecting);\r
+                       view.Select (new DataSourceSelectArguments ());\r
+                       Assert.IsNotNull (CustomEventParameterCollection, "Select event not fired");\r
+                       Assert.AreEqual (1, CustomEventParameterCollection.Count, "Parameter count");\r
+                       Assert.AreEqual ("@ProductID", CustomEventParameterCollection [0].ParameterName, "Parameter name");\r
+                       Assert.AreEqual (10, CustomEventParameterCollection [0].Value, "Parameter value");\r
+               }\r
+\r
+               [Test]\r
+               public void ExecuteUpdate ()\r
+               {\r
+                       SqlPoker sql = new SqlPoker ();\r
+                       sql.ConnectionString = "Data Source=fake\\SQLEXPRESS;Initial Catalog=Northwind;User ID=sa";\r
+                       sql.ProviderName = "System.Data.SqlClient";\r
+                       CustomSqlDataSourceView view = new CustomSqlDataSourceView (sql, "TestView", null);\r
+                       view.SelectCommandType = SqlDataSourceCommandType.Text;\r
+                       view.SelectCommand = "SELECT * FROM products WHERE ProductID = @ProductID;";\r
+                       view.UpdateCommandType = SqlDataSourceCommandType.Text;\r
+                       view.UpdateCommand = "UPDATE Table1 SET UserName = @UserName WHERE UserId = @UserId";\r
+                       view.OldValuesParameterFormatString = "origin_{0}";\r
+                       view.Updating += new SqlDataSourceCommandEventHandler (view_Updating);\r
+                       view.UpdateParameters.Add (new Parameter ("UserName", TypeCode.String, "TestUser"));\r
+                       view.UpdateParameters.Add (new Parameter ("UserId", TypeCode.Int32, "1"));\r
+                       view.Update (null, null, null);\r
+                       Assert.IsNotNull (CustomEventParameterCollection, "Update event not fired");\r
+                       Assert.AreEqual (2, CustomEventParameterCollection.Count, "Parameter count");\r
+                       Assert.AreEqual ("@UserName", CustomEventParameterCollection[0].ParameterName, "Parameter name#1");\r
+                       Assert.AreEqual ("TestUser", CustomEventParameterCollection[0].Value, "Parameter value#1");\r
+                       Assert.AreEqual ("@UserId", CustomEventParameterCollection[1].ParameterName, "Parameter name#2");\r
+                       Assert.AreEqual (1, CustomEventParameterCollection[1].Value, "Parameter value#2");\r
+               }\r
+\r
+               [Test]\r
+               public void ExecuteInsert ()\r
+               {\r
+                       SqlPoker sql = new SqlPoker ();\r
+                       sql.ConnectionString = "Data Source=fake\\SQLEXPRESS;Initial Catalog=Northwind;User ID=sa";\r
+                       sql.ProviderName = "System.Data.SqlClient";\r
+                       CustomSqlDataSourceView view = new CustomSqlDataSourceView (sql, "TestView", null);\r
+                       view.SelectCommandType = SqlDataSourceCommandType.Text;\r
+                       view.SelectCommand = "SELECT * FROM products WHERE ProductID = @ProductID;";\r
+                       view.InsertCommandType = SqlDataSourceCommandType.Text;\r
+                       view.InsertCommand = "INSERT INTO Table1 (UserId, UserName) VALUES ({0},{1})";\r
+                       view.InsertParameters.Add (new Parameter ("UserId", TypeCode.Int32, "15"));\r
+                       view.InsertParameters.Add (new Parameter ("UserName", TypeCode.String, "newuser"));\r
+                       view.OldValuesParameterFormatString = "origin_{0}";\r
+                       view.Inserting += new SqlDataSourceCommandEventHandler (view_Inserting);\r
+                       view.Insert (null);\r
+                       Assert.IsNotNull (CustomEventParameterCollection, "Insert event not fired");\r
+                       Assert.AreEqual (2, CustomEventParameterCollection.Count, "Parameter count");\r
+                       Assert.AreEqual ("@UserId", CustomEventParameterCollection[0].ParameterName, "Parameter name#2");\r
+                       Assert.AreEqual (15, CustomEventParameterCollection[0].Value, "Parameter value#2");\r
+                       Assert.AreEqual ("@UserName", CustomEventParameterCollection[1].ParameterName, "Parameter name#1");\r
+                       Assert.AreEqual ("newuser", CustomEventParameterCollection[1].Value, "Parameter value#1");\r
+               }\r
+\r
+               [Test]\r
+               public void ExecuteInsertWithCollection ()\r
+               {\r
+                       SqlPoker sql = new SqlPoker ();\r
+                       sql.ConnectionString = "Data Source=fake\\SQLEXPRESS;Initial Catalog=Northwind;User ID=sa";\r
+                       sql.ProviderName = "System.Data.SqlClient";\r
+                       CustomSqlDataSourceView view = new CustomSqlDataSourceView (sql, "TestView", null);\r
+                       view.SelectCommandType = SqlDataSourceCommandType.Text;\r
+                       view.SelectCommand = "SELECT * FROM products WHERE ProductID = @ProductID;";\r
+                       view.InsertCommandType = SqlDataSourceCommandType.Text;\r
+                       view.InsertCommand = "INSERT INTO products (UserId, UserName) VALUES ({0},{1})";\r
+                       view.InsertParameters.Add (new Parameter ("UserId", TypeCode.Int32, "15"));\r
+                       view.InsertParameters.Add (new Parameter ("UserName", TypeCode.String, "newuser"));\r
+                       view.OldValuesParameterFormatString = "origin_{0}";\r
+                       view.Inserting += new SqlDataSourceCommandEventHandler (view_Inserting);\r
+                       Hashtable value = new Hashtable ();\r
+                       value.Add ("Description", "TestDescription");\r
+                       view.Insert (value);\r
+                       Assert.IsNotNull (CustomEventParameterCollection, "Insert event not fired");\r
+                       Assert.AreEqual (3, CustomEventParameterCollection.Count, "Parameter count");\r
+                       Assert.AreEqual ("@UserId", CustomEventParameterCollection[0].ParameterName, "Parameter name#1");\r
+                       Assert.AreEqual (15, CustomEventParameterCollection[0].Value, "Parameter value#1");\r
+                       Assert.AreEqual ("@UserName", CustomEventParameterCollection[1].ParameterName, "Parameter name#2");\r
+                       Assert.AreEqual ("newuser", CustomEventParameterCollection[1].Value, "Parameter value#2");\r
+                       Assert.AreEqual ("@Description", CustomEventParameterCollection[2].ParameterName, "Parameter name#3");\r
+                       Assert.AreEqual ("TestDescription", CustomEventParameterCollection[2].Value, "Parameter value#3");\r
+               }\r
+\r
+               [Test]\r
+               public void ExecuteDelete ()\r
+               {\r
+                       SqlPoker sql = new SqlPoker ();\r
+                       sql.ConnectionString = "Data Source=fake\\SQLEXPRESS;Initial Catalog=Northwind;User ID=sa";\r
+                       sql.ProviderName = "System.Data.SqlClient";\r
+                       CustomSqlDataSourceView view = new CustomSqlDataSourceView (sql, "TestView", null);\r
+                       view.SelectCommandType = SqlDataSourceCommandType.Text;\r
+                       view.SelectCommand = "SELECT * FROM products WHERE ProductID = @ProductID;";\r
+                       view.DeleteCommandType = SqlDataSourceCommandType.Text;\r
+                       view.DeleteCommand = "DELETE * FROM products WHERE ProductID = @ProductID;";\r
+                       view.DeleteParameters.Add (new Parameter ("ProductId", TypeCode.Int32, "15"));\r
+                       view.OldValuesParameterFormatString = "origin_{0}";\r
+                       view.Deleting += new SqlDataSourceCommandEventHandler (view_Deleting);\r
+                       view.Delete (null, null);\r
+                       Assert.IsNotNull (CustomEventParameterCollection, "Delete event not fired");\r
+                       Assert.AreEqual (1, CustomEventParameterCollection.Count, "Parameter count");\r
+                       Assert.AreEqual ("@ProductId", CustomEventParameterCollection[0].ParameterName, "Parameter name#1");\r
+                       Assert.AreEqual (15, CustomEventParameterCollection[0].Value, "Parameter value#1");\r
+               }\r
+\r
+               [Test]\r
+               public void ExecuteDeleteWithOldValues ()\r
+               {\r
+                       SqlPoker sql = new SqlPoker ();\r
+                       sql.ConnectionString = "Data Source=fake\\SQLEXPRESS;Initial Catalog=Northwind;User ID=sa";\r
+                       sql.ProviderName = "System.Data.SqlClient";\r
+                       CustomSqlDataSourceView view = new CustomSqlDataSourceView (sql, "TestView", null);\r
+                       view.SelectCommandType = SqlDataSourceCommandType.Text;\r
+                       view.SelectCommand = "SELECT * FROM products WHERE ProductID = @ProductID;";\r
+                       view.DeleteCommandType = SqlDataSourceCommandType.Text;\r
+                       view.DeleteCommand = "DELETE * FROM products WHERE ProductID = @ProductID;";\r
+                       view.DeleteParameters.Add (new Parameter ("ProductID", TypeCode.Int32, "15"));\r
+                       view.OldValuesParameterFormatString = "origin_{0}";\r
+                       view.ConflictDetection = ConflictOptions.CompareAllValues;\r
+                       view.Deleting += new SqlDataSourceCommandEventHandler (view_Deleting);\r
+                       Hashtable oldvalue = new Hashtable ();\r
+                       oldvalue.Add ("ProductID", 10);\r
+                       view.Delete (null,oldvalue );\r
+                       Assert.IsNotNull (CustomEventParameterCollection, "Delete event not fired");\r
+                       Assert.AreEqual (1, CustomEventParameterCollection.Count, "Parameter count");\r
+                       Assert.AreEqual ("@origin_ProductID", CustomEventParameterCollection[0].ParameterName, "Parameter name#2");\r
+                       Assert.AreEqual (10, CustomEventParameterCollection[0].Value, "Parameter value#2");\r
+               }\r
+\r
+               [Test]\r
+               public void ExecuteDeleteWithMergedOldValues ()\r
+               {\r
+                       SqlPoker sql = new SqlPoker ();\r
+                       sql.ConnectionString = "Data Source=fake\\SQLEXPRESS;Initial Catalog=Northwind;User ID=sa";\r
+                       sql.ProviderName = "System.Data.SqlClient";\r
+                       CustomSqlDataSourceView view = new CustomSqlDataSourceView (sql, "TestView", null);\r
+                       view.SelectCommandType = SqlDataSourceCommandType.Text;\r
+                       view.SelectCommand = "SELECT * FROM products WHERE ProductID = @ProductID;";\r
+                       view.DeleteCommandType = SqlDataSourceCommandType.Text;\r
+                       view.DeleteCommand = "DELETE * FROM products WHERE ProductID = @ProductID;";\r
+                       view.DeleteParameters.Add (new Parameter ("ProductId", TypeCode.Int32, "15"));\r
+                       view.OldValuesParameterFormatString = "origin_{0}";\r
+                       view.ConflictDetection = ConflictOptions.CompareAllValues;\r
+                       view.Deleting += new SqlDataSourceCommandEventHandler (view_Deleting);\r
+                       Hashtable oldvalue = new Hashtable ();\r
+                       oldvalue.Add ("Desc", "Description");\r
+                       view.Delete (null, oldvalue);\r
+                       Assert.IsNotNull (CustomEventParameterCollection, "Delete event not fired");\r
+                       Assert.AreEqual (2, CustomEventParameterCollection.Count, "Parameter count");\r
+                       Assert.AreEqual ("@ProductId", CustomEventParameterCollection[0].ParameterName, "Parameter name#1");\r
+                       Assert.AreEqual (15, CustomEventParameterCollection[0].Value, "Parameter value#1");\r
+                       Assert.AreEqual ("@origin_Desc", CustomEventParameterCollection[1].ParameterName, "Parameter name#2");\r
+                       Assert.AreEqual ("Description", CustomEventParameterCollection[1].Value, "Parameter value#2");\r
+               }\r
+\r
+               [Test]\r
+               public void ExecuteDeleteWithMergedValues ()\r
+               {\r
+                       SqlPoker sql = new SqlPoker ();\r
+                       sql.ConnectionString = "Data Source=fake\\SQLEXPRESS;Initial Catalog=Northwind;User ID=sa";\r
+                       sql.ProviderName = "System.Data.SqlClient";\r
+                       CustomSqlDataSourceView view = new CustomSqlDataSourceView (sql, "TestView", null);\r
+                       view.SelectCommandType = SqlDataSourceCommandType.Text;\r
+                       view.SelectCommand = "SELECT * FROM products WHERE ProductID = @ProductID;";\r
+                       view.DeleteCommandType = SqlDataSourceCommandType.Text;\r
+                       view.DeleteCommand = "DELETE * FROM products WHERE ProductID = @ProductID;";\r
+                       view.DeleteParameters.Add (new Parameter ("ProductId", TypeCode.Int32, "15"));\r
+                       view.OldValuesParameterFormatString = "origin_{0}";\r
+                       view.Deleting += new SqlDataSourceCommandEventHandler (view_Deleting);\r
+                       Hashtable value = new Hashtable ();\r
+                       value.Add ("Desc", "Description");\r
+                       view.Delete (value, null);\r
+                       Assert.IsNotNull (CustomEventParameterCollection, "Delete event not fired");\r
+                       Assert.AreEqual (2, CustomEventParameterCollection.Count, "Parameter count");\r
+                       Assert.AreEqual ("@ProductId", CustomEventParameterCollection[0].ParameterName, "Parameter name#1");\r
+                       Assert.AreEqual (15, CustomEventParameterCollection[0].Value, "Parameter value#1");\r
+                       Assert.AreEqual ("@origin_Desc", CustomEventParameterCollection[1].ParameterName, "Parameter name#2");\r
+                       Assert.AreEqual ("Description", CustomEventParameterCollection[1].Value, "Parameter value#2");\r
+               }\r
+\r
+               [Test]\r
+               public void ExecuteDelete_KeysAndOldValues_OverwriteChanges () \r
+               {\r
+                       SqlPoker sql = new SqlPoker ();\r
+                       sql.ConnectionString = "Data Source=fake\\SQLEXPRESS;Initial Catalog=Northwind;User ID=sa";\r
+                       sql.ProviderName = "System.Data.SqlClient";\r
+                       CustomSqlDataSourceView view = new CustomSqlDataSourceView (sql, "TestView", null);\r
+                       IDictionary keys;\r
+                       IDictionary values;\r
+                       IDictionary oldValues;\r
+                       InitializeView (view, out keys, out values, out oldValues);\r
+\r
+                       view.ConflictDetection = ConflictOptions.OverwriteChanges;\r
+\r
+                       view.Delete (keys, oldValues);\r
+\r
+                       Assert.IsNotNull (CustomEventParameterCollection, "KeysAndOldValues_OverwriteChanges");\r
+                       Assert.AreEqual ("String:@origin_ProductID=k_10", PassedParameters, "KeysAndOldValues_OverwriteChanges Values");\r
+               }\r
+\r
+               [Test]\r
+               public void ExecuteDelete_KeysAndOldValues_CompareAllValues () \r
+               {\r
+                       SqlPoker sql = new SqlPoker ();\r
+                       sql.ConnectionString = "Data Source=fake\\SQLEXPRESS;Initial Catalog=Northwind;User ID=sa";\r
+                       sql.ProviderName = "System.Data.SqlClient";\r
+                       CustomSqlDataSourceView view = new CustomSqlDataSourceView (sql, "TestView", null);\r
+                       IDictionary keys;\r
+                       IDictionary values;\r
+                       IDictionary oldValues;\r
+                       InitializeView (view, out keys, out values, out oldValues);\r
+\r
+                       view.ConflictDetection = ConflictOptions.CompareAllValues;\r
+\r
+                       view.Delete (keys, oldValues);\r
+\r
+                       Assert.IsNotNull (CustomEventParameterCollection, "KeysAndOldValues_CompareAllValues");\r
+                       Assert.AreEqual ("String:@origin_ProductID=ov_10, String:@origin_Description=ov_Beautifull, String:@origin_Name=ov_ColorTV", PassedParameters, "KeysAndOldValues_CompareAllValues Values");\r
+               }\r
+\r
+               [Test]\r
+               public void ExecuteDelete_KeysAndOldValues_CompareAllValues2 () \r
+               {\r
+                       SqlPoker sql = new SqlPoker ();\r
+                       sql.ConnectionString = "Data Source=fake\\SQLEXPRESS;Initial Catalog=Northwind;User ID=sa";\r
+                       sql.ProviderName = "System.Data.SqlClient";\r
+                       CustomSqlDataSourceView view = new CustomSqlDataSourceView (sql, "TestView", null);\r
+                       IDictionary keys;\r
+                       IDictionary values;\r
+                       IDictionary oldValues;\r
+                       InitializeView (view, out keys, out values, out oldValues);\r
+                       view.DeleteParameters.Add ("origin_ProductID", "po_10");\r
+\r
+                       view.ConflictDetection = ConflictOptions.CompareAllValues;\r
+\r
+                       view.Delete (keys, oldValues);\r
+\r
+                       Assert.IsNotNull (CustomEventParameterCollection, "ExecuteDelete_KeysAndOldValues_CompareAllValues2");\r
+                       string [] expectedParams = new string []\r
+                                               { \r
+                                                       "String:@origin_ProductID=ov_10", \r
+                                                       "String:@origin_Description=ov_Beautifull",\r
+                                                       "String:@origin_Name=ov_ColorTV" \r
+                                               };\r
+                       string [] actualValues = PassedParameters.Split (new string [] { ", " }, StringSplitOptions.RemoveEmptyEntries);\r
+                       Assert.AreEqual (expectedParams.Length, actualValues.Length, "ExecuteDelete_KeysAndOldValues_CompareAllValues2 Params count");\r
+                       ValidatePassedParams (expectedParams, actualValues, "ExecuteDelete_KeysAndOldValues_CompareAllValues2 expecte '{0}'");\r
+               }\r
+\r
+               private static void ValidatePassedParams (string [] expectedParams, string [] actualValues, string errorMessageFormat) \r
+               {\r
+                       foreach (string eps in expectedParams) {\r
+                               bool found = false;\r
+                               foreach (string aps in actualValues) {\r
+                                       if (eps == aps) {\r
+                                               found = true;\r
+                                               break;\r
+                                       }\r
+                               }\r
+                               Assert.IsTrue (found, String.Format (errorMessageFormat, eps));\r
+                       }\r
+               }\r
+\r
+               private void InitializeView (CustomSqlDataSourceView view, out IDictionary keys, out IDictionary values, out IDictionary oldValues) \r
+               {\r
+                       view.SelectCommandType = SqlDataSourceCommandType.Text;\r
+                       view.SelectCommand = "SELECT * FROM products WHERE ProductID = @ProductID;";\r
+                       view.SelectParameters.Add (new Parameter ("ProductID", TypeCode.String, "p_10"));\r
+                       view.Selecting += new SqlDataSourceSelectingEventHandler (view_Selecting);\r
+\r
+                       view.DeleteCommandType = SqlDataSourceCommandType.Text;\r
+                       view.DeleteCommand = "DELETE * FROM products WHERE ProductID = @ProductID;";\r
+                       view.DeleteParameters.Add (new Parameter ("ProductID", TypeCode.String, "p_10"));\r
+                       view.Deleting += new SqlDataSourceCommandEventHandler (view_Deleting);\r
+\r
+                       view.InsertCommandType = SqlDataSourceCommandType.Text;\r
+                       view.InsertCommand = "INSERT INTO products (ProductID, Name, Description) VALUES (@ProductID, @Name, @Description)";\r
+                       view.InsertParameters.Add (new Parameter ("ProductID", TypeCode.String, "p_15"));\r
+                       view.InsertParameters.Add (new Parameter ("Name", TypeCode.String, "p_NewProduct"));\r
+                       view.InsertParameters.Add (new Parameter ("Description", TypeCode.String, "p_Description"));\r
+                       view.Inserting += new SqlDataSourceCommandEventHandler (view_Inserting);\r
+\r
+                       view.UpdateCommandType = SqlDataSourceCommandType.Text;\r
+                       view.UpdateCommand = "UPDATE products SET Name = @Name, Description = @Description WHERE ProductID = @ProductID";\r
+                       view.UpdateParameters.Add (new Parameter ("ProductID", TypeCode.String, "p_15"));\r
+                       view.UpdateParameters.Add (new Parameter ("Name", TypeCode.String, "p_UpdatedProduct"));\r
+                       view.UpdateParameters.Add (new Parameter ("Description", TypeCode.String, "p_UpdatedDescription"));\r
+                       view.Updating += new SqlDataSourceCommandEventHandler (view_Updating);\r
+\r
+                       view.OldValuesParameterFormatString = "origin_{0}";\r
+\r
+                       keys = new Hashtable ();\r
+                       values = new Hashtable ();\r
+                       oldValues = new Hashtable ();\r
+\r
+                       keys.Add ("ProductID", "k_10");\r
+\r
+                       values.Add ("ProductID", "n_10");\r
+                       values.Add ("Name", "n_ColorTV");\r
+                       values.Add ("Description", "n_Beautifull");\r
+\r
+                       oldValues.Add ("ProductID", "ov_10");\r
+                       oldValues.Add ("Name", "ov_ColorTV");\r
+                       oldValues.Add ("Description", "ov_Beautifull");                 \r
+               }\r
+\r
+               [Test]\r
+               public void ExecuteUpdateWithOldValues ()\r
+               {\r
+                       SqlPoker sql = new SqlPoker ();\r
+                       sql.ConnectionString = "Data Source=fake\\SQLEXPRESS;Initial Catalog=Northwind;User ID=sa";\r
+                       sql.ProviderName = "System.Data.SqlClient";\r
+                       CustomSqlDataSourceView view = new CustomSqlDataSourceView (sql, "TestView", null);\r
+                       view.SelectCommandType = SqlDataSourceCommandType.Text;\r
+                       view.SelectCommand = "SELECT * FROM products WHERE ProductID = @ProductID;";\r
+                       view.UpdateCommandType = SqlDataSourceCommandType.Text;\r
+                       view.UpdateCommand = "UPDATE Table1 SET UserName = @UserName WHERE UserId = @UserId";\r
+                       view.OldValuesParameterFormatString = "origin_{0}";\r
+                       view.ConflictDetection = ConflictOptions.CompareAllValues;\r
+                       view.Updating += new SqlDataSourceCommandEventHandler (view_Updating);\r
+                       view.UpdateParameters.Add (new Parameter ("UserName", TypeCode.String, "TestUser"));\r
+                       view.UpdateParameters.Add (new Parameter ("UserId", TypeCode.Int32, "1"));\r
+                       Hashtable oldvalue = new Hashtable ();\r
+                       oldvalue.Add ("UserId", 2);\r
+                       view.Update (null, null, oldvalue);\r
+                       Assert.IsNotNull (CustomEventParameterCollection, "Update event not fired");\r
+                       Assert.AreEqual (3, CustomEventParameterCollection.Count, "Parameter count");\r
+                       Assert.AreEqual ("@UserName", CustomEventParameterCollection[0].ParameterName, "Parameter name#1");\r
+                       Assert.AreEqual ("TestUser", CustomEventParameterCollection[0].Value, "Parameter value#1");\r
+                       Assert.AreEqual ("@UserId", CustomEventParameterCollection[1].ParameterName, "Parameter name#2");\r
+                       Assert.AreEqual (1, CustomEventParameterCollection[1].Value, "Parameter value#2");\r
+                       Assert.AreEqual ("@origin_UserId", CustomEventParameterCollection[2].ParameterName, "Parameter name#3");\r
+                       Assert.AreEqual (2, CustomEventParameterCollection[2].Value, "Parameter value#3");\r
+               }\r
+\r
+               [Test]\r
+               public void ExecuteUpdateWithOverwriteParameters ()\r
+               {\r
+                       SqlPoker sql = new SqlPoker ();\r
+                       sql.ConnectionString = "Data Source=fake\\SQLEXPRESS;Initial Catalog=Northwind;User ID=sa";\r
+                       sql.ProviderName = "System.Data.SqlClient";\r
+                       CustomSqlDataSourceView view = new CustomSqlDataSourceView (sql, "TestView", null);\r
+                       view.SelectCommandType = SqlDataSourceCommandType.Text;\r
+                       view.SelectCommand = "SELECT * FROM products WHERE ProductID = @ProductID;";\r
+                       view.UpdateCommandType = SqlDataSourceCommandType.Text;\r
+                       view.UpdateCommand = "UPDATE Table1 SET UserName = @UserName WHERE UserId = @UserId";\r
+                       view.OldValuesParameterFormatString = "origin_{0}";\r
+                       view.ConflictDetection = ConflictOptions.OverwriteChanges;\r
+                       view.Updating += new SqlDataSourceCommandEventHandler (view_Updating);\r
+                       view.UpdateParameters.Add (new Parameter ("UserName", TypeCode.String, "TestUser"));\r
+                       view.UpdateParameters.Add (new Parameter ("UserId", TypeCode.Int32, "1"));\r
+                       Hashtable value = new Hashtable ();\r
+                       value.Add ("UserId", 2);\r
+                       view.Update (value, null, null);\r
+                       Assert.IsNotNull (CustomEventParameterCollection, "Update event not fired");\r
+                       Assert.AreEqual (2, CustomEventParameterCollection.Count, "Parameter count");\r
+                       Assert.AreEqual ("@UserName", CustomEventParameterCollection[0].ParameterName, "Parameter name#1");\r
+                       Assert.AreEqual ("TestUser", CustomEventParameterCollection[0].Value, "Parameter value#1");\r
+                       Assert.AreEqual ("@origin_UserId", CustomEventParameterCollection[1].ParameterName, "Parameter name#2");\r
+                       Assert.AreEqual (2, CustomEventParameterCollection[1].Value, "Parameter value#2");\r
+               }\r
+\r
+               [Test]\r
+               public void ExecuteUpdateWithMargeParameters ()\r
+               {\r
+                       SqlPoker sql = new SqlPoker ();\r
+                       sql.ConnectionString = "Data Source=fake\\SQLEXPRESS;Initial Catalog=Northwind;User ID=sa";\r
+                       sql.ProviderName = "System.Data.SqlClient";\r
+                       CustomSqlDataSourceView view = new CustomSqlDataSourceView (sql, "TestView", null);\r
+                       view.SelectCommandType = SqlDataSourceCommandType.Text;\r
+                       view.SelectCommand = "SELECT * FROM products WHERE ProductID = @ProductID;";\r
+                       view.UpdateCommandType = SqlDataSourceCommandType.Text;\r
+                       view.UpdateCommand = "UPDATE Table1 SET UserName = @UserName WHERE UserId = @UserId";\r
+                       view.OldValuesParameterFormatString = "origin_{0}";\r
+                       view.ConflictDetection = ConflictOptions.OverwriteChanges;\r
+                       view.Updating += new SqlDataSourceCommandEventHandler (view_Updating);\r
+                       view.UpdateParameters.Add (new Parameter ("UserName", TypeCode.String, "TestUser"));\r
+                       view.UpdateParameters.Add (new Parameter ("UserId", TypeCode.Int32, "1"));\r
+                       Hashtable value = new Hashtable ();\r
+                       value.Add ("UserLName", "TestLName");\r
+                       view.Update (null, value, null);\r
+                       Assert.IsNotNull (CustomEventParameterCollection, "Update event not fired");\r
+                       Assert.AreEqual (3, CustomEventParameterCollection.Count, "Parameter count");\r
+                       Assert.AreEqual ("@UserName", CustomEventParameterCollection[0].ParameterName, "Parameter name#1");\r
+                       Assert.AreEqual ("TestUser", CustomEventParameterCollection[0].Value, "Parameter value#1");\r
+                       Assert.AreEqual ("@UserId", CustomEventParameterCollection[1].ParameterName, "Parameter name#2");\r
+                       Assert.AreEqual (1, CustomEventParameterCollection[1].Value, "Parameter value#2");\r
+                       Assert.AreEqual ("@UserLName", CustomEventParameterCollection[2].ParameterName, "Parameter name#3");\r
+                       Assert.AreEqual ("TestLName", CustomEventParameterCollection[2].Value, "Parameter value#3");\r
+               }\r
+\r
+               [Test]\r
+               public void ExecuteUpdate_KeysValuesAndOldValues_OverwriteChanges () \r
+               {\r
+                       SqlPoker sql = new SqlPoker ();\r
+                       sql.ConnectionString = "Data Source=fake\\SQLEXPRESS;Initial Catalog=Northwind;User ID=sa";\r
+                       sql.ProviderName = "System.Data.SqlClient";\r
+                       CustomSqlDataSourceView view = new CustomSqlDataSourceView (sql, "TestView", null);\r
+                       IDictionary keys;\r
+                       IDictionary values;\r
+                       IDictionary oldValues;\r
+                       InitializeView (view, out keys, out values, out oldValues);\r
+\r
+                       view.ConflictDetection = ConflictOptions.OverwriteChanges;\r
+\r
+                       view.Update (keys, values, oldValues);\r
+\r
+                       Assert.IsNotNull (CustomEventParameterCollection, "ExecuteUpdate_KeysValuesAndOldValues_OverwriteChanges");\r
+                       string [] expectedParams = new string []\r
+                                               { \r
+                                                       "String:@ProductID=n_10", \r
+                                                       "String:@Name=n_ColorTV", \r
+                                                       "String:@Description=n_Beautifull",\r
+                                                       "String:@origin_ProductID=k_10" \r
+                                               };\r
+                       string [] actualValues = PassedParameters.Split (new string [] { ", " }, StringSplitOptions.RemoveEmptyEntries);\r
+                       Assert.AreEqual (expectedParams.Length, actualValues.Length, "ExecuteDelete_KeysAndOldValues_CompareAllValues2 Params count");\r
+                       ValidatePassedParams (expectedParams, actualValues, "ExecuteDelete_KeysAndOldValues_CompareAllValues2 expecte '{0}'");\r
+               }\r
+\r
+               [Test]\r
+               public void ExecuteUpdate_KeysValuesAndOldValues_CompareAllValues () \r
+               {\r
+                       SqlPoker sql = new SqlPoker ();\r
+                       sql.ConnectionString = "Data Source=fake\\SQLEXPRESS;Initial Catalog=Northwind;User ID=sa";\r
+                       sql.ProviderName = "System.Data.SqlClient";\r
+                       CustomSqlDataSourceView view = new CustomSqlDataSourceView (sql, "TestView", null);\r
+                       IDictionary keys;\r
+                       IDictionary values;\r
+                       IDictionary oldValues;\r
+                       InitializeView (view, out keys, out values, out oldValues);\r
+\r
+                       view.ConflictDetection = ConflictOptions.CompareAllValues;\r
+\r
+                       view.Update (keys, values, oldValues);\r
+\r
+                       Assert.IsNotNull (CustomEventParameterCollection, "ExecuteUpdate_KeysValuesAndOldValues_CompareAllValues");\r
+                       string [] expectedParams = new string []\r
+                                               { \r
+                                                       "String:@ProductID=n_10", \r
+                                                       "String:@Name=n_ColorTV", \r
+                                                       "String:@Description=n_Beautifull",\r
+                                                       "String:@origin_ProductID=ov_10", \r
+                                                       "String:@origin_Name=ov_ColorTV", \r
+                                                       "String:@origin_Description=ov_Beautifull",\r
+                                               };\r
+                       string [] actualValues = PassedParameters.Split (new string [] { ", " }, StringSplitOptions.RemoveEmptyEntries);\r
+                       Assert.AreEqual (expectedParams.Length, actualValues.Length, "ExecuteDelete_KeysAndOldValues_CompareAllValues2 Params count");\r
+                       ValidatePassedParams (expectedParams, actualValues, "ExecuteDelete_KeysAndOldValues_CompareAllValues2 expecte '{0}'");\r
+               }\r
+\r
+               void view_Updating (object sender, SqlDataSourceCommandEventArgs e)\r
+               {\r
+                       SqlDataSourceTest.CustomEventParameterCollection = (SqlParameterCollection) e.Command.Parameters;\r
+                       SqlDataSourceTest.PassedParameters = FormatParameters (SqlDataSourceTest.CustomEventParameterCollection);\r
+                       e.Cancel = true;\r
+               }\r
+\r
+               void view_Selecting (object sender, SqlDataSourceSelectingEventArgs e)\r
+               {\r
+                       SqlDataSourceTest.CustomEventParameterCollection = (SqlParameterCollection) e.Command.Parameters;\r
+                       SqlDataSourceTest.PassedParameters = FormatParameters (SqlDataSourceTest.CustomEventParameterCollection);\r
+                       e.Cancel = true;\r
+               }\r
+\r
+               void view_Inserting (object sender, SqlDataSourceCommandEventArgs e)\r
+               {\r
+                       SqlDataSourceTest.CustomEventParameterCollection = (SqlParameterCollection) e.Command.Parameters;\r
+                       SqlDataSourceTest.PassedParameters = FormatParameters (SqlDataSourceTest.CustomEventParameterCollection);\r
+                       e.Cancel = true;\r
+               }\r
+\r
+               void view_Deleting (object sender, SqlDataSourceCommandEventArgs e)\r
+               {\r
+                       SqlDataSourceTest.CustomEventParameterCollection = (SqlParameterCollection) e.Command.Parameters;\r
+                       SqlDataSourceTest.PassedParameters = FormatParameters (SqlDataSourceTest.CustomEventParameterCollection);\r
+                       e.Cancel = true;\r
+               }\r
+\r
+               private string FormatParameters (SqlParameterCollection sqlParameterCollection) \r
+               {\r
+                       StringBuilder sb = new StringBuilder ();\r
+                       foreach (SqlParameter p in sqlParameterCollection) {\r
+                               if (sb.Length > 0) {\r
+                                       sb.Append (", ");\r
+                               }\r
+                               sb.AppendFormat ("{0}:{1}={2}", p.DbType, p.ParameterName, p.Value);\r
+                       }\r
+                       return sb.ToString ();\r
+               }\r
+\r
+               #region help_results\r
+               class eventAssert\r
+               {\r
+                       private static int _testcounter;\r
+                       private static bool _eventChecker;\r
+                       private eventAssert ()\r
+                       {\r
+                               _testcounter = 0;\r
+                       }\r
+\r
+                       public static bool eventChecker\r
+                       {\r
+                               get\r
+                               {\r
+                                       throw new NotImplementedException ();\r
+                               }\r
+                               set\r
+                               {\r
+                                       _eventChecker = value;\r
+                               }\r
+                       }\r
+\r
+                       static private void testAdded ()\r
+                       {\r
+                               _testcounter++;\r
+                               _eventChecker = false;\r
+                       }\r
+\r
+                       public static void IsTrue (string msg)\r
+                       {\r
+                               Assert.IsTrue (_eventChecker, msg + "#" + _testcounter);\r
+                               testAdded ();\r
+\r
+                       }\r
+\r
+                       public static void IsFalse (string msg)\r
+                       {\r
+                               Assert.IsFalse (_eventChecker, msg + "#" + _testcounter);\r
+                               testAdded ();\r
+                       }\r
+               }\r
+               #endregion\r
+\r
+               [Test]\r
+               [Category ("NotWorking")]\r
+               public void SqlDataSource_DataSourceViewChanged ()\r
+               {\r
+                       SqlPoker sql = new SqlPoker ();\r
+                       ((IDataSource) sql).DataSourceChanged += new EventHandler (SqlDataSourceTest_DataSourceChanged);\r
+\r
+                       sql.DoRaiseDataSourceChangedEvent ();\r
+                       eventAssert.IsTrue ("SqlDataSourceView"); // Assert include counter the first is zero\r
+                       sql.CacheKeyDependency = "hi";\r
+                       eventAssert.IsFalse ("SqlDataSourceView");\r
+                       sql.CancelSelectOnNullParameter = false;\r
+                       eventAssert.IsFalse ("SqlDataSourceView");\r
+                       sql.ConflictDetection = ConflictOptions.CompareAllValues;\r
+                       eventAssert.IsFalse ("SqlDataSourceView");\r
+                       sql.DeleteCommandType = SqlDataSourceCommandType.StoredProcedure;\r
+                       eventAssert.IsFalse ("SqlDataSourceView");\r
+                       sql.InsertCommandType = SqlDataSourceCommandType.StoredProcedure;\r
+                       eventAssert.IsFalse ("SqlDataSourceView");\r
+                       sql.SelectCommandType = SqlDataSourceCommandType.StoredProcedure;\r
+                       eventAssert.IsFalse ("SqlDataSourceView");\r
+                       sql.UpdateCommandType = SqlDataSourceCommandType.StoredProcedure;\r
+                       eventAssert.IsFalse ("SqlDataSourceView");\r
+                       sql.OldValuesParameterFormatString = "{1}";\r
+                       eventAssert.IsFalse ("SqlDataSourceView");\r
+                       sql.SqlCacheDependency = "hi";\r
+                       eventAssert.IsFalse ("SqlDataSourceView");\r
+                       sql.SortParameterName = "hi";\r
+                       eventAssert.IsFalse ("SqlDataSourceView");\r
+                       sql.CacheDuration = 1;\r
+                       eventAssert.IsFalse ("SqlDataSourceView");\r
+                       sql.CacheExpirationPolicy = DataSourceCacheExpiry.Sliding;\r
+                       eventAssert.IsFalse ("SqlDataSourceView");\r
+                       sql.EnableCaching = true;\r
+                       eventAssert.IsFalse ("SqlDataSourceView");\r
+                       sql.DataSourceMode = SqlDataSourceMode.DataReader;\r
+                       eventAssert.IsTrue ("SqlDataSourceView");\r
+                       sql.DeleteCommand = "DELETE foo";\r
+                       eventAssert.IsFalse ("SqlDataSourceView");\r
+                       sql.InsertCommand = "INSERT foo";\r
+                       eventAssert.IsFalse ("SqlDataSourceView");\r
+                       sql.SelectCommand = "SELECT foo";\r
+                       eventAssert.IsFalse ("SqlDataSourceView");\r
+                       sql.UpdateCommand = "UPDATE foo";\r
+                       eventAssert.IsFalse ("SqlDataSourceView");\r
+                       sql.FilterExpression = "hi";\r
+                       eventAssert.IsFalse ("SqlDataSourceView");\r
+               }\r
+\r
+               void SqlDataSourceTest_DataSourceChanged (object sender, EventArgs e)\r
+               {\r
+                       eventAssert.eventChecker = true;\r
+               }\r
+\r
+               //exceptions \r
+               [Test]\r
+               [ExpectedException (typeof (NotSupportedException))]\r
+               public void ExecuteUpdateException ()\r
+               {\r
+                       SqlPoker sql = new SqlPoker ();\r
+                       sql.ConnectionString = "Data Source=fake\\SQLEXPRESS;Initial Catalog=Northwind;User ID=sa";\r
+                       sql.ProviderName = "System.Data.SqlClient";\r
+                       CustomSqlDataSourceView view = new CustomSqlDataSourceView (sql, "TestView", null);\r
+                       view.Update (null, null, null);\r
+               }\r
+\r
+               [Test]\r
+               [ExpectedException (typeof (NotSupportedException))]\r
+               public void ExecuteDeleteException ()\r
+               {\r
+                       SqlPoker sql = new SqlPoker ();\r
+                       sql.ConnectionString = "Data Source=fake\\SQLEXPRESS;Initial Catalog=Northwind;User ID=sa";\r
+                       sql.ProviderName = "System.Data.SqlClient";\r
+                       CustomSqlDataSourceView view = new CustomSqlDataSourceView (sql, "TestView", null);\r
+                       view.Delete (null, null);\r
+               }\r
+\r
+               [Test]\r
+               [ExpectedException (typeof (NotSupportedException))]\r
+               public void ExecuteInsertException ()\r
+               {\r
+                       SqlPoker sql = new SqlPoker ();\r
+                       sql.ConnectionString = "Data Source=fake\\SQLEXPRESS;Initial Catalog=Northwind;User ID=sa";\r
+                       sql.ProviderName = "System.Data.SqlClient";\r
+                       CustomSqlDataSourceView view = new CustomSqlDataSourceView (sql, "TestView", null);\r
+                       view.SelectCommandType = SqlDataSourceCommandType.Text;\r
+                       view.SelectCommand = "SELECT * FROM products WHERE ProductID = @ProductID;";\r
+                       view.Insert (null);\r
+               }\r
+\r
+               [Test]  //ConflictOptions.CompareAllValues must include old value collection\r
+               [ExpectedException (typeof (InvalidOperationException))]\r
+               public void ExecuteUpdateWithOldValuesException ()\r
+               {\r
+                       SqlPoker sql = new SqlPoker ();\r
+                       sql.ConnectionString = "Data Source=fake\\SQLEXPRESS;Initial Catalog=Northwind;User ID=sa";\r
+                       sql.ProviderName = "System.Data.SqlClient";\r
+                       CustomSqlDataSourceView view = new CustomSqlDataSourceView (sql, "TestView", null);\r
+                       view.SelectCommandType = SqlDataSourceCommandType.Text;\r
+                       view.SelectCommand = "SELECT * FROM products WHERE ProductID = @ProductID;";\r
+                       view.UpdateCommandType = SqlDataSourceCommandType.Text;\r
+                       view.UpdateCommand = "UPDATE Table1 SET UserName = @UserName WHERE UserId = @UserId";\r
+                       view.OldValuesParameterFormatString = "origin_{0}";\r
+                       view.ConflictDetection = ConflictOptions.CompareAllValues;\r
+                       view.Updating += new SqlDataSourceCommandEventHandler (view_Updating);\r
+                       view.UpdateParameters.Add (new Parameter ("UserName", TypeCode.String, "TestUser"));\r
+                       view.UpdateParameters.Add (new Parameter ("UserId", TypeCode.Int32, "1"));\r
+                       view.Update (null, null, null);\r
+               }\r
+\r
+               [Test] //ConflictOptions.CompareAllValues must include old value collection\r
+               [ExpectedException (typeof (InvalidOperationException))]\r
+               public void ExecuteDeleteWithOldValuesException ()\r
+               {\r
+                       SqlPoker sql = new SqlPoker ();\r
+                       sql.ConnectionString = "Data Source=fake\\SQLEXPRESS;Initial Catalog=Northwind;User ID=sa";\r
+                       sql.ProviderName = "System.Data.SqlClient";\r
+                       CustomSqlDataSourceView view = new CustomSqlDataSourceView (sql, "TestView", null);\r
+                       view.SelectCommandType = SqlDataSourceCommandType.Text;\r
+                       view.SelectCommand = "SELECT * FROM products WHERE ProductID = @ProductID;";\r
+                       view.DeleteCommandType = SqlDataSourceCommandType.Text;\r
+                       view.DeleteCommand = "DELETE * FROM products WHERE ProductID = @ProductID;";\r
+                       view.DeleteParameters.Add (new Parameter ("ProductId", TypeCode.Int32, "15"));\r
+                       view.OldValuesParameterFormatString = "origin_{0}";\r
+                       view.ConflictDetection = ConflictOptions.CompareAllValues;\r
+                       view.Deleting += new SqlDataSourceCommandEventHandler (view_Deleting);\r
+                       Hashtable oldvalue = new Hashtable ();\r
+                       oldvalue.Add ("ProductID", 10);\r
+                       view.Delete (null, null);\r
+               }\r
+       }\r
+}\r
+\r
+#endif\r