Browse Source

2005-06-01 Sureshkumar T <[email protected]>

	* SqlParameter.cs: Parameter's value can be SqlTypes. Convert to
	framework type to pass to TDS layer. Fixes bug #75044.


svn path=/trunk/mcs/; revision=45289
Sureshkumar T 20 years ago
parent
commit
b7661e984e

+ 5 - 0
mcs/class/System.Data/System.Data.SqlClient/ChangeLog

@@ -1,3 +1,8 @@
+2005-06-01  Sureshkumar T  <[email protected]>
+
+	* SqlParameter.cs: Parameter's value can be SqlTypes. Convert to
+	framework type to pass to TDS layer. Fixes bug #75044.
+
 2005-05-24 Umadevi S <[email protected]>
 	* fixed some 2.0 and 1.0 specific fields/attributes for various classes.
 	* Added SqlClientMetaDataCollectionNames.cs, Implemented some 2.0

+ 61 - 7
mcs/class/System.Data/System.Data.SqlClient/SqlParameter.cs

@@ -82,7 +82,7 @@ namespace System.Data.SqlClient {
 
 		public SqlParameter (string parameterName, object value) 
 		{
-			metaParameter = new TdsMetaParameter (parameterName, value);
+			metaParameter = new TdsMetaParameter (parameterName, SqlTypeToFrameworkType (value));
 			this.sourceVersion = DataRowVersion.Current;
 			InferSqlType (value);
 		}
@@ -105,8 +105,10 @@ namespace System.Data.SqlClient {
 		[EditorBrowsable (EditorBrowsableState.Advanced)]	 
 		public SqlParameter (string parameterName, SqlDbType dbType, int size, ParameterDirection direction, bool isNullable, byte precision, byte scale, string sourceColumn, DataRowVersion sourceVersion, object value) 
 		{
-			metaParameter = new TdsMetaParameter (parameterName, size, isNullable, precision, scale, value);
-
+			metaParameter = new TdsMetaParameter (parameterName, size, 
+							      isNullable, precision, 
+							      scale, 
+							      SqlTypeToFrameworkType (value));
 			SqlDbType = dbType;
 			Direction = direction;
 			SourceColumn = sourceColumn;
@@ -383,7 +385,7 @@ namespace System.Data.SqlClient {
 			set { 
 				if (!isTypeSet)
 					InferSqlType (value);
-				metaParameter.Value = value; 
+				metaParameter.Value = SqlTypeToFrameworkType (value);
 			}
 		}
 
@@ -411,46 +413,61 @@ namespace System.Data.SqlClient {
 
 			switch (type.FullName) {
 			case "System.Int64":
+			case "System.Data.SqlTypes.SqlInt64":
 				SetSqlDbType (SqlDbType.BigInt);
 				break;
 			case "System.Boolean":
+			case "System.Data.SqlTypes.SqlBoolean":
 				SetSqlDbType (SqlDbType.Bit);
 				break;
 			case "System.String":
+			case "System.Data.SqlTypes.SqlString":
 				SetSqlDbType (SqlDbType.NVarChar);
 				break;
 			case "System.DateTime":
+			case "System.Data.SqlTypes.SqlDateTime":
 				SetSqlDbType (SqlDbType.DateTime);
 				break;
 			case "System.Decimal":
+			case "System.Data.SqlTypes.SqlDecimal":
 				SetSqlDbType (SqlDbType.Decimal);
 				break;
 			case "System.Double":
+			case "System.Data.SqlTypes.SqlDouble":
 				SetSqlDbType (SqlDbType.Float);
 				break;
 			case "System.Byte[]":
+			case "System.Data.SqlTypes.SqlBinary":
 				SetSqlDbType (SqlDbType.VarBinary);
 				break;
 			case "System.Byte":
+			case "System.Data.SqlTypes.SqlByte":
 				SetSqlDbType (SqlDbType.TinyInt);
 				break;
 			case "System.Int32":
+			case "System.Data.SqlTypes.SqlInt32":
 				SetSqlDbType (SqlDbType.Int);
 				break;
 			case "System.Single":
+			case "System.Data.SqlTypes.Single":
 				SetSqlDbType (SqlDbType.Real);
 				break;
 			case "System.Int16":
+			case "System.Data.SqlTypes.SqlInt16":
 				SetSqlDbType (SqlDbType.SmallInt);
 				break;
 			case "System.Guid":
+			case "System.Data.SqlTypes.SqlGuid":
 				SetSqlDbType (SqlDbType.UniqueIdentifier);
 				break;
-			case "System.Object":
-				SetSqlDbType (SqlDbType.Variant);
+			case "System.Money":
+			case "System.SmallMoney":
+			case "System.Data.SqlTypes.SqlMoney":
+				SetSqlDbType (SqlDbType.Money);
 				break;
+			case "System.Object":
 			case "System.DBNull":
-				SetSqlDbType(SqlDbType.Variant); // variant can contain numeric,
+				SetSqlDbType (SqlDbType.Variant); // variant can contain numeric,
 								//string,binary or data and also nul								    //values, so we can later resolve 									// it to correct type.	
 				break;	
 			default:
@@ -739,6 +756,43 @@ namespace System.Data.SqlClient {
 			return ParameterName;
 		}
 
+		private object SqlTypeToFrameworkType (object value)
+		{
+			if (! (value is INullable)) // if the value is not SqlType
+				return value;
+
+			// Map to .net type, as Mono TDS respects only types from .net
+			switch (value.GetType ().FullName) {
+			case "System.Data.SqlTypes.SqlBinary":
+				return ( (SqlBinary) value).Value;
+			case "System.Data.SqlTypes.SqlBoolean":
+				return ( (SqlBoolean) value).Value;
+			case "System.Data.SqlTypes.SqlByte":
+				return ( (SqlByte) value).Value;
+			case "System.Data.SqlTypes.SqlDateTime":
+				return ( (SqlDateTime) value).Value;
+			case "System.Data.SqlTypes.SqlDecimal":
+				return ( (SqlDecimal) value).Value;
+			case "System.Data.SqlTypes.SqlDouble":
+				return ( (SqlDouble) value).Value;
+			case "System.Data.SqlTypes.SqlGuid":
+				return ( (SqlGuid) value).Value;
+			case "System.Data.SqlTypes.SqlInt16":
+				return ( (SqlInt16) value).Value;
+			case "System.Data.SqlTypes.SqlInt32 ":
+				return ( (SqlInt32 ) value).Value;
+			case "System.Data.SqlTypes.SqlInt64":
+				return ( (SqlInt64) value).Value;
+			case "System.Data.SqlTypes.SqlMoney":
+				return ( (SqlMoney) value).Value;
+			case "System.Data.SqlTypes.SqlSingle":
+				return ( (SqlSingle) value).Value;
+			case "System.Data.SqlTypes.SqlString":
+				return ( (SqlString) value).Value;
+			}
+			return value;
+		}
+
 #if NET_2_0
                 [MonoTODO]
                 public override void CopyTo (DbParameter param)