2009-09-15 Veerapuram Varadhan <vvaradhan@novell.com>
authorVeerapuram Varadhan <v.varadhan@gmail.com>
Fri, 15 May 2009 10:48:55 +0000 (10:48 -0000)
committerVeerapuram Varadhan <v.varadhan@gmail.com>
Fri, 15 May 2009 10:48:55 +0000 (10:48 -0000)
* OracleParameter.cs: Consider DBNull.Value as null and
update size and sizeSet accordingly.

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

mcs/class/System.Data.OracleClient/System.Data.OracleClient/ChangeLog
mcs/class/System.Data.OracleClient/System.Data.OracleClient/OracleParameter.cs
mcs/class/System.Data.OracleClient/Test/System.Data.OracleClient/ChangeLog
mcs/class/System.Data.OracleClient/Test/System.Data.OracleClient/OracleParameterTest.cs

index ef35fe739a797fa673a8406a173786f868d1aa60..e9b6cddb4a59e6e48895c9919175b3bbfbb28025 100644 (file)
@@ -1,3 +1,8 @@
+2009-09-15  Veerapuram Varadhan  <vvaradhan@novell.com>
+
+       * OracleParameter.cs: Consider DBNull.Value as null and 
+       update size and sizeSet accordingly.
+       
 2009-05-15  Veerapuram Varadhan  <vvaradhan@novell.com>
 
        ** Fixes #424908
index a078d1cda2de4d15e4ae5666fddd82bb3482d92d..3e59c46a9d5a2f100d092af644c838421e430edf 100644 (file)
@@ -123,9 +123,9 @@ namespace System.Data.OracleClient
                {
                        this.name = name;
                        this.value = value;
-                       if (value != null) {
+                       if (value != null && value != DBNull.Value) {
                                this.sizeSet = true;
-                               this.size = InferSize (value);
+                               this.size = InferSize ();
                        }
                        srcColumn = string.Empty;
                        SourceVersion = DataRowVersion.Current;
@@ -153,9 +153,12 @@ namespace System.Data.OracleClient
                        this.name = name;
                        if (size < 0)
                                throw new ArgumentException("Size must be not be negative.");
-                       this.size = size;
-                       this.sizeSet = true;
+                       
                        this.value = value;
+                       if (value != null && value != DBNull.Value) {
+                               this.size = size;
+                               this.sizeSet = true;
+                       }
                        SourceColumnNullMapping = sourceColumnNullMapping;
                        OracleType = oracleType;
                        Direction = direction;
@@ -169,9 +172,12 @@ namespace System.Data.OracleClient
                        this.name = name;
                        if (size < 0)
                                throw new ArgumentException("Size must be not be negative.");
-                       this.size = size;
-                       this.sizeSet = true;
+                       
                        this.value = value;
+                       if (value != null && value != DBNull.Value) {
+                               this.size = size;
+                               this.sizeSet = true;
+                       }
                        this.isNullable = isNullable;
                        this.precision = precision;
                        this.scale = scale;
@@ -359,7 +365,7 @@ namespace System.Data.OracleClient
                                this.value = value;
                                if (!oracleTypeSet)
                                        InferOracleType (value);
-                               if (value != null) {
+                               if (value != null && value != DBNull.Value) {
                                        this.size = InferSize ();
                                        this.sizeSet = true;
                                }
@@ -876,7 +882,7 @@ namespace System.Data.OracleClient
                private void InferOracleType (object value)
                {
                        // Should we throw an exception here?
-                       if (value is null)
+                       if (value == null || value == DBNull.Value)
                                return;
                        
                        Type type = value.GetType ();
index 7aeaf5be0db863acdc08a8bff0774f99d4209754..155f66368bfd07ec667a03ec7f6df7eff80f1526 100644 (file)
@@ -1,3 +1,7 @@
+2009-05-15  Veerapuram Varadhan  <vvaradhan@novell.com>
+
+       * OracleParameterTest.cs: Added tests corresponding to #424908
+       
 2008-05-07  Gert Driesen  <drieseng@users.sourceforge.net>
 
        * OracleDataAdapterTest.cs: Added ctor and basic property tests.
index 4bc6a3ead9e99a40256dfce5294d2545caa812d1..c02a8c618c191c3f1da3e8094d134c17b1606ccd 100644 (file)
@@ -369,5 +369,141 @@ namespace MonoTests.System.Data.OracleClient
                                        "Unexpected result value.");
                        }
                }
+
+               private void ParamSize_SPCreation_ValueInsertion (OracleConnection conn)
+               {
+                   string createSP =
+                       "CREATE OR REPLACE PROCEDURE GetTextValue \n" +
+                       "( \n" +
+                       "id IN Number(10),\n" +
+                       "text OUT varchar2(64) \n" +
+                       ")\n" +
+                       "AS\n" +
+                       "BEGIN\n" +
+                       "SELECT oratest.text INTO text \n" +
+                       "  FROM oratest\n" +
+                       "  WHERE oratest.id = id; \n" +
+                       "END;\n";
+
+                   string insertValue = "INSERT INTO oratest VALUES " +
+                       "(424608, \"This is a test for 424908 parameter size bug\", NULL);";
+
+                   OracleCommand cmd = new OracleCommand ();
+                   cmd.Connection = conn;
+                   cmd.CommandText = createSP;
+                   cmd.CommandType = CommandType.Text;
+                   cmd.ExecuteNonQuery ();
+
+                   cmd.CommandText = insertValue;
+                   cmd.ExecuteNonQuery ();
+
+                   cmd.CommandText = "commit";
+                   cmd.ExecuteNonQuery ();
+                   cmd.Dispose ();
+               }
+
+               [Test]
+               public void ParamSize_424908_ValueError ()
+               {
+                   OracleConnection conn = new OracleConnection (connection_string);
+                   conn.Open ();
+
+                   ParamSize_SPCreation_ValueInsertion (conn);
+
+                   OracleCommand cmd = new OracleCommand ();
+                   cmd.Connection = conn;
+
+                   OracleParameter id = new OracleParameter ();
+                   id.ParameterName = "id";
+                   id.OracleType = OracleType.Number;
+                   id.Direction = ParameterDirection.Input;
+                   id.Value = 424908;
+                   cmd.Parameters.Add (id);
+
+                   OracleParameter text = new OracleParameter ();
+                   text.ParameterName = "text";                                                                    
+                   text.OracleType = OracleType.NVarChar;                                                                  
+                   text.Direction = ParameterDirection.Output;
+                   text.Value = string.Empty;
+                   text.Size = 64;
+                   cmd.Parameters.Add (text);
+
+                   try {
+                       cmd.CommandType = CommandType.StoredProcedure;
+                       cmd.CommandText = "GetTextValue";
+                       cmd.ExecuteNonQuery ();
+                       Assert.Fail ("Expected OracleException not occurred!");
+                   } catch (OracleException ex) {
+                       Assert.AreEqual ("6502", ex.Code, "Error code mismatch");
+                       connection.Close ();
+                   }
+               }
+
+               [Test]
+               public void ParamSize_424908_ConstructorSizeSetTest ()
+               {
+                   OracleConnection conn = new OracleConnection (connection_string);
+                   conn.Open ();
+
+                   ParamSize_SPCreation_ValueInsertion (conn);
+
+                   OracleCommand cmd = new OracleCommand ();
+                   cmd.Connection = conn;
+
+                   OracleParameter id = new OracleParameter ();
+                   id.ParameterName = "id";
+                   id.OracleType = OracleType.Number;
+                   id.Direction = ParameterDirection.Input;
+                   id.Value = 424908;
+                   cmd.Parameters.Add (id);
+
+                   OracleParameter text = new OracleParameter ("text", OracleType.NVarChar, 64);
+                   text.Direction = ParameterDirection.Output;
+                   text.Value = string.Empty;
+                   text.Size = 64;
+                   cmd.Parameters.Add (text);
+
+                   cmd.CommandType = CommandType.StoredProcedure;
+                   cmd.CommandText = "GetTextValue";
+                   cmd.ExecuteNonQuery ();
+
+                   Assert.AreEqual ("This is a test for 424908 parameter size bug", text.Value, "OracleParameter value mismatch");
+                   conn.Close ();
+               }
+               [Test]
+               public void ParamSize_424908_SizeNotSetError ()
+               {
+                   OracleConnection conn = new OracleConnection (connection_string);
+                   conn.Open ();
+
+                   ParamSize_SPCreation_ValueInsertion (conn);
+
+                   OracleCommand cmd = new OracleCommand ();
+                   cmd.Connection = conn;
+
+                   OracleParameter id = new OracleParameter ();
+                   id.ParameterName = "id";
+                   id.OracleType = OracleType.Number;
+                   id.Direction = ParameterDirection.Input;
+                   id.Value = 424908;
+                   cmd.Parameters.Add (id);
+
+                   OracleParameter text = new OracleParameter ();
+                   text.ParameterName = "text";                                                                    
+                   text.OracleType = OracleType.NVarChar;                                                                  
+                   text.Direction = ParameterDirection.Output;
+                   text.Value = DBNull.Value;
+                   cmd.Parameters.Add (text);
+
+                   try {
+                       cmd.CommandType = CommandType.StoredProcedure;
+                       cmd.CommandText = "GetTextValue";
+                       cmd.ExecuteNonQuery ();
+                       Assert.Fail ("Expected System.Exception not occurred!");
+                   } catch (Exception ex) {
+                       conn.Close ();
+                       Assert.AreEqual ("Size must be set.", ex.Message, "Exception mismatch");
+                   }               
+               }
        }
 }