536cd135cc
Former-commit-id: 5624ac747d633e885131e8349322922b6a59baaa
797 lines
37 KiB
C#
797 lines
37 KiB
C#
//------------------------------------------------------------------------------
|
|
// <copyright file="SQLConvert.cs" company="Microsoft">
|
|
// Copyright (c) Microsoft Corporation. All rights reserved.
|
|
// </copyright>
|
|
// <owner current="true" primary="true">Microsoft</owner>
|
|
// <owner current="true" primary="false">Microsoft</owner>
|
|
//------------------------------------------------------------------------------
|
|
namespace System.Data.Common {
|
|
|
|
using System;
|
|
using System.Data.SqlTypes;
|
|
using System.Xml;
|
|
using System.Globalization;
|
|
using System.Diagnostics;
|
|
|
|
internal static class SqlConvert {
|
|
|
|
public static SqlByte ConvertToSqlByte(object value) {
|
|
Debug.Assert(value != null, "null argument in ConvertToSqlByte");
|
|
if ((value == DBNull.Value)) { // null is not valid, SqlByte is struct
|
|
return SqlByte.Null;
|
|
}
|
|
Type valueType = value.GetType();
|
|
StorageType stype = DataStorage.GetStorageType(valueType);
|
|
|
|
switch(stype) {
|
|
case StorageType.SqlByte:
|
|
return (SqlByte)value;
|
|
case StorageType.Byte:
|
|
return (byte)value;
|
|
default:
|
|
throw ExceptionBuilder.ConvertFailed(valueType, typeof(SqlByte));
|
|
}
|
|
}
|
|
|
|
public static SqlInt16 ConvertToSqlInt16(object value) {
|
|
Debug.Assert(value != null, "null argument in ConvertToSqlInt16");
|
|
if (value == DBNull.Value) {
|
|
return SqlInt16.Null;
|
|
}
|
|
Type valueType = value.GetType();
|
|
StorageType stype = DataStorage.GetStorageType(valueType);
|
|
switch(stype) {
|
|
case StorageType.Byte:
|
|
return (byte)value;
|
|
case StorageType.Int16:
|
|
return (Int16)value;
|
|
case StorageType.SqlByte:
|
|
return (SqlByte) value;
|
|
case StorageType.SqlInt16:
|
|
return (SqlInt16) value;
|
|
default:
|
|
throw ExceptionBuilder.ConvertFailed(valueType, typeof(SqlInt16));
|
|
}
|
|
}
|
|
|
|
public static SqlInt32 ConvertToSqlInt32(object value) {
|
|
Debug.Assert(value != null, "null argument in ConvertToSqlInt32");
|
|
if (value == DBNull.Value) {
|
|
return SqlInt32.Null;
|
|
}
|
|
Type valueType = value.GetType();
|
|
StorageType stype = DataStorage.GetStorageType(valueType);
|
|
switch(stype) {
|
|
case StorageType.SqlInt32:
|
|
return (SqlInt32) value;
|
|
case StorageType.Int32:
|
|
return (int) value;
|
|
case StorageType.SqlInt16:
|
|
return (SqlInt16)value;
|
|
case StorageType.Int16:
|
|
return (Int16) value;
|
|
case StorageType.UInt16:
|
|
return (UInt16) value;
|
|
case StorageType.SqlByte:
|
|
return (SqlByte)value;
|
|
case StorageType.Byte:
|
|
return (byte)value;
|
|
|
|
default:
|
|
throw ExceptionBuilder.ConvertFailed(valueType, typeof(SqlInt32));
|
|
}
|
|
}
|
|
|
|
public static SqlInt64 ConvertToSqlInt64(object value) {
|
|
Debug.Assert(value != null, "null argument in ConvertToSqlInt64");
|
|
if (value == DBNull.Value) {
|
|
return SqlInt32.Null;
|
|
}
|
|
Type valueType = value.GetType();
|
|
StorageType stype = DataStorage.GetStorageType(valueType);
|
|
switch(stype) {
|
|
case StorageType.SqlInt64:
|
|
return (SqlInt64) value;
|
|
case StorageType.Int64:
|
|
return (Int64) value;
|
|
case StorageType.SqlInt16:
|
|
return (SqlInt16)value;
|
|
case StorageType.Int16:
|
|
return (Int16)value;
|
|
case StorageType.UInt16:
|
|
return (UInt16)value;
|
|
case StorageType.SqlInt32:
|
|
return (SqlInt32)value;
|
|
case StorageType.Int32:
|
|
return (Int32)value;
|
|
case StorageType.UInt32:
|
|
return (UInt32)value;
|
|
case StorageType.SqlByte:
|
|
return (SqlByte)value;
|
|
case StorageType.Byte:
|
|
return (byte)value;
|
|
default:
|
|
throw ExceptionBuilder.ConvertFailed(valueType, typeof(SqlInt64));
|
|
}
|
|
}
|
|
|
|
public static SqlDouble ConvertToSqlDouble(object value) {
|
|
Debug.Assert(value != null, "null argument in ConvertToSqlDouble");
|
|
if (value == DBNull.Value) {
|
|
return SqlDouble.Null;
|
|
}
|
|
Type valueType = value.GetType();
|
|
StorageType stype = DataStorage.GetStorageType(valueType);
|
|
|
|
switch(stype) {
|
|
case StorageType.SqlDouble:
|
|
return (SqlDouble)value;
|
|
case StorageType.Double:
|
|
return (double)value;
|
|
case StorageType.SqlInt64:
|
|
return (SqlInt64) value;
|
|
case StorageType.Int64:
|
|
return (Int64) value;
|
|
case StorageType.UInt64:
|
|
return (UInt64) value;
|
|
case StorageType.SqlInt16:
|
|
return (SqlInt16)value;
|
|
case StorageType.Int16:
|
|
return (Int16)value;
|
|
case StorageType.UInt16:
|
|
return (UInt16)value;
|
|
case StorageType.SqlInt32:
|
|
return (SqlInt32)value;
|
|
case StorageType.Int32:
|
|
return (Int32)value;
|
|
case StorageType.UInt32:
|
|
return (UInt32)value;
|
|
case StorageType.SqlByte:
|
|
return (SqlByte)value;
|
|
case StorageType.Byte:
|
|
return (byte)value;
|
|
case StorageType.SqlSingle:
|
|
return (SqlSingle)value;
|
|
case StorageType.Single:
|
|
return (Single)value;
|
|
case StorageType.SqlMoney:
|
|
return (SqlMoney)value;
|
|
case StorageType.SqlDecimal:
|
|
return (SqlDecimal)value;
|
|
default:
|
|
throw ExceptionBuilder.ConvertFailed(valueType, typeof(SqlDouble));
|
|
}
|
|
}
|
|
|
|
public static SqlDecimal ConvertToSqlDecimal(object value) {
|
|
Debug.Assert(value != null, "null argument in ConvertToSqlDecimal");
|
|
if (value == DBNull.Value) {
|
|
return SqlDecimal.Null;
|
|
}
|
|
Type valueType = value.GetType();
|
|
StorageType stype = DataStorage.GetStorageType(valueType);
|
|
|
|
switch(stype) {
|
|
case StorageType.SqlDecimal:
|
|
return (SqlDecimal)value;
|
|
case StorageType.Decimal:
|
|
return (decimal)value;
|
|
case StorageType.SqlInt64:
|
|
return (SqlInt64) value;
|
|
case StorageType.Int64:
|
|
return (Int64) value;
|
|
case StorageType.UInt64:
|
|
return (UInt64) value;
|
|
case StorageType.SqlInt16:
|
|
return (SqlInt16)value;
|
|
case StorageType.Int16:
|
|
return (Int16)value;
|
|
case StorageType.UInt16:
|
|
return (UInt16)value;
|
|
case StorageType.SqlInt32:
|
|
return (SqlInt32)value;
|
|
case StorageType.Int32:
|
|
return (Int32)value;
|
|
case StorageType.UInt32:
|
|
return (UInt32)value;
|
|
case StorageType.SqlByte:
|
|
return (SqlByte)value;
|
|
case StorageType.Byte:
|
|
return (byte)value;
|
|
case StorageType.SqlMoney:
|
|
return (SqlMoney)value;
|
|
default:
|
|
throw ExceptionBuilder.ConvertFailed(valueType, typeof(SqlDecimal));
|
|
}
|
|
}
|
|
|
|
public static SqlSingle ConvertToSqlSingle(object value) {
|
|
Debug.Assert(value != null, "null argument in ConvertToSqlSingle");
|
|
if (value == DBNull.Value) {
|
|
return SqlSingle.Null;
|
|
}
|
|
Type valueType = value.GetType();
|
|
StorageType stype = DataStorage.GetStorageType(valueType);
|
|
|
|
switch(stype) {
|
|
case StorageType.SqlSingle:
|
|
return (SqlSingle)value;
|
|
case StorageType.Single:
|
|
return (Single)value;
|
|
case StorageType.SqlInt64:
|
|
return (SqlInt64) value;
|
|
case StorageType.Int64:
|
|
return (Int64) value;
|
|
case StorageType.UInt64:
|
|
return (UInt64) value;
|
|
case StorageType.SqlInt16:
|
|
return (SqlInt16)value;
|
|
case StorageType.Int16:
|
|
return (Int16)value;
|
|
case StorageType.UInt16:
|
|
return (UInt16)value;
|
|
case StorageType.SqlInt32:
|
|
return (SqlInt32)value;
|
|
case StorageType.Int32:
|
|
return (Int32)value;
|
|
case StorageType.UInt32:
|
|
return (UInt32)value;
|
|
case StorageType.SqlByte:
|
|
return (SqlByte)value;
|
|
case StorageType.Byte:
|
|
return (byte)value;
|
|
case StorageType.SqlMoney:
|
|
return (SqlMoney)value;
|
|
case StorageType.SqlDecimal:
|
|
return (SqlDecimal)value;
|
|
default:
|
|
throw ExceptionBuilder.ConvertFailed(valueType, typeof(SqlSingle));
|
|
}
|
|
}
|
|
|
|
public static SqlMoney ConvertToSqlMoney(object value) {
|
|
Debug.Assert(value != null, "null argument in ConvertToSqlMoney");
|
|
if (value == DBNull.Value) {
|
|
return SqlMoney.Null;
|
|
}
|
|
Type valueType = value.GetType();
|
|
StorageType stype = DataStorage.GetStorageType(valueType);
|
|
|
|
switch(stype) {
|
|
case StorageType.SqlMoney:
|
|
return (SqlMoney)value;
|
|
case StorageType.Decimal:
|
|
return (decimal)value;
|
|
case StorageType.SqlInt64:
|
|
return (SqlInt64) value;
|
|
case StorageType.Int64:
|
|
return (Int64) value;
|
|
case StorageType.UInt64:
|
|
return (UInt64) value;
|
|
case StorageType.SqlInt16:
|
|
return (SqlInt16)value;
|
|
case StorageType.Int16:
|
|
return (Int16)value;
|
|
case StorageType.UInt16:
|
|
return (UInt16)value;
|
|
case StorageType.SqlInt32:
|
|
return (SqlInt32)value;
|
|
case StorageType.Int32:
|
|
return (Int32)value;
|
|
case StorageType.UInt32:
|
|
return (UInt32)value;
|
|
case StorageType.SqlByte:
|
|
return (SqlByte)value;
|
|
case StorageType.Byte:
|
|
return (byte)value;
|
|
default:
|
|
throw ExceptionBuilder.ConvertFailed(valueType, typeof(SqlMoney));
|
|
}
|
|
}
|
|
|
|
|
|
public static SqlDateTime ConvertToSqlDateTime(object value) {
|
|
Debug.Assert(value != null, "null argument in ConvertToSqlDateTime");
|
|
if (value == DBNull.Value) {
|
|
return SqlDateTime.Null;
|
|
}
|
|
Type valueType = value.GetType();
|
|
StorageType stype = DataStorage.GetStorageType(valueType);
|
|
|
|
switch(stype) {
|
|
case StorageType.SqlDateTime:
|
|
return (SqlDateTime)value;
|
|
case StorageType.DateTime:
|
|
return (DateTime) value;
|
|
default:
|
|
throw ExceptionBuilder.ConvertFailed(valueType, typeof(SqlDateTime));
|
|
}
|
|
}
|
|
|
|
public static SqlBoolean ConvertToSqlBoolean(object value) {
|
|
Debug.Assert(value != null, "null argument in ConvertToSqlBoolean");
|
|
if ((value == DBNull.Value) || (value == null)) {
|
|
return SqlBoolean.Null;
|
|
}
|
|
Type valueType = value.GetType();
|
|
StorageType stype = DataStorage.GetStorageType(valueType);
|
|
|
|
switch(stype) {
|
|
case StorageType.SqlBoolean:
|
|
return (SqlBoolean)value;
|
|
case StorageType.Boolean:
|
|
return (bool) value;
|
|
default:
|
|
throw ExceptionBuilder.ConvertFailed(valueType, typeof(SqlBoolean));
|
|
}
|
|
}
|
|
|
|
public static SqlGuid ConvertToSqlGuid(object value) {
|
|
Debug.Assert(value != null, "null argument in ConvertToSqlGuid");
|
|
if (value == DBNull.Value) {
|
|
return SqlGuid.Null;
|
|
}
|
|
Type valueType = value.GetType();
|
|
StorageType stype = DataStorage.GetStorageType(valueType);
|
|
|
|
switch(stype) {
|
|
case StorageType.SqlGuid:
|
|
return (SqlGuid)value;
|
|
case StorageType.Guid:
|
|
return (Guid) value;
|
|
default:
|
|
throw ExceptionBuilder.ConvertFailed(valueType, typeof(SqlGuid));
|
|
}
|
|
}
|
|
|
|
public static SqlBinary ConvertToSqlBinary(object value) {
|
|
Debug.Assert(value != null, "null argument in ConvertToSqlBinary");
|
|
if (value == DBNull.Value) {
|
|
return SqlBinary.Null;
|
|
}
|
|
Type valueType = value.GetType();
|
|
StorageType stype = DataStorage.GetStorageType(valueType);
|
|
|
|
switch(stype) {
|
|
case StorageType.SqlBinary:
|
|
return (SqlBinary) value;
|
|
case StorageType.ByteArray:
|
|
return (byte[])value;
|
|
default:
|
|
throw ExceptionBuilder.ConvertFailed(valueType, typeof(SqlBinary));
|
|
}
|
|
}
|
|
|
|
public static SqlString ConvertToSqlString(object value) {
|
|
Debug.Assert(value != null, "null argument in ConvertToSqlString");
|
|
if ((value == DBNull.Value) || (value == null)) {
|
|
return SqlString.Null;
|
|
}
|
|
Type valueType = value.GetType();
|
|
StorageType stype = DataStorage.GetStorageType(valueType);
|
|
|
|
switch(stype) {
|
|
case StorageType.SqlString:
|
|
return (SqlString)value;
|
|
case StorageType.String:
|
|
return (string)value;
|
|
default:
|
|
throw ExceptionBuilder.ConvertFailed(valueType, typeof(SqlString));
|
|
}
|
|
}
|
|
|
|
public static SqlChars ConvertToSqlChars(object value) {
|
|
Debug.Assert(value != null, "null argument in ConvertToSqlChars");
|
|
if (value == DBNull.Value) {
|
|
return SqlChars.Null;
|
|
}
|
|
Type valueType = value.GetType();
|
|
StorageType stype = DataStorage.GetStorageType(valueType);
|
|
switch(stype) {
|
|
case StorageType.SqlChars:
|
|
return (SqlChars)value;
|
|
default:
|
|
throw ExceptionBuilder.ConvertFailed(valueType, typeof(SqlChars));
|
|
}
|
|
}
|
|
|
|
public static SqlBytes ConvertToSqlBytes(object value) {
|
|
Debug.Assert(value != null, "null argument in ConvertToSqlBytes");
|
|
if (value == DBNull.Value) {
|
|
return SqlBytes.Null;
|
|
}
|
|
Type valueType = value.GetType();
|
|
StorageType stype = DataStorage.GetStorageType(valueType);
|
|
switch(stype) {
|
|
case StorageType.SqlBytes:
|
|
return (SqlBytes)value;
|
|
default:
|
|
throw ExceptionBuilder.ConvertFailed(valueType, typeof(SqlBytes));
|
|
}
|
|
}
|
|
|
|
public static DateTimeOffset ConvertStringToDateTimeOffset(string value, IFormatProvider formatProvider) {
|
|
return DateTimeOffset.Parse(value, formatProvider);
|
|
}
|
|
// this should not be called for XmlSerialization
|
|
public static object ChangeTypeForDefaultValue(object value, Type type, IFormatProvider formatProvider) {
|
|
if (type == typeof(System.Numerics.BigInteger)) {
|
|
if ((DBNull.Value == value) || (null == value)) { return DBNull.Value; }
|
|
return BigIntegerStorage.ConvertToBigInteger(value, formatProvider);
|
|
}
|
|
else if (value is System.Numerics.BigInteger) {
|
|
return BigIntegerStorage.ConvertFromBigInteger((System.Numerics.BigInteger)value, type, formatProvider);
|
|
}
|
|
|
|
return ChangeType2(value, DataStorage.GetStorageType(type), type, formatProvider);
|
|
}
|
|
|
|
// this should not be called for XmlSerialization
|
|
public static object ChangeType2(object value, StorageType stype, Type type, IFormatProvider formatProvider) {
|
|
switch(stype) { // if destination is SQL type
|
|
case StorageType.SqlBinary:
|
|
return (SqlConvert.ConvertToSqlBinary(value));
|
|
case StorageType.SqlBoolean:
|
|
return (SqlConvert.ConvertToSqlBoolean(value));
|
|
case StorageType.SqlByte:
|
|
return (SqlConvert.ConvertToSqlByte(value));
|
|
case StorageType.SqlBytes:
|
|
return (SqlConvert.ConvertToSqlBytes(value));
|
|
case StorageType.SqlChars:
|
|
return (SqlConvert.ConvertToSqlChars(value));
|
|
case StorageType.SqlDateTime:
|
|
return (SqlConvert.ConvertToSqlDateTime(value));
|
|
case StorageType.SqlDecimal:
|
|
return (SqlConvert.ConvertToSqlDecimal(value));
|
|
case StorageType.SqlDouble:
|
|
return (SqlConvert.ConvertToSqlDouble(value));
|
|
case StorageType.SqlGuid:
|
|
return (SqlConvert.ConvertToSqlGuid(value));
|
|
case StorageType.SqlInt16:
|
|
return (SqlConvert.ConvertToSqlInt16(value));
|
|
case StorageType.SqlInt32:
|
|
return (SqlConvert.ConvertToSqlInt32(value));
|
|
case StorageType.SqlInt64:
|
|
return (SqlConvert.ConvertToSqlInt64(value));
|
|
case StorageType.SqlMoney:
|
|
return (SqlConvert.ConvertToSqlMoney(value));
|
|
case StorageType.SqlSingle:
|
|
return (SqlConvert.ConvertToSqlSingle(value));
|
|
case StorageType.SqlString:
|
|
return (SqlConvert.ConvertToSqlString(value));
|
|
/* case StorageType.SqlXml:
|
|
if (DataStorage.IsObjectNull(value)) {
|
|
return SqlXml.Null;
|
|
}
|
|
goto default;
|
|
*/
|
|
default: // destination is CLR
|
|
if ((DBNull.Value == value) || (null == value)) {
|
|
return DBNull.Value;
|
|
}
|
|
Type valueType = value.GetType();
|
|
StorageType vtype = DataStorage.GetStorageType(valueType);
|
|
// destination is CLR
|
|
switch(vtype) {// and source is SQL type
|
|
case StorageType.SqlBinary:
|
|
case StorageType.SqlBoolean:
|
|
case StorageType.SqlByte:
|
|
case StorageType.SqlBytes:
|
|
case StorageType.SqlChars:
|
|
case StorageType.SqlDateTime:
|
|
case StorageType.SqlDecimal:
|
|
case StorageType.SqlDouble:
|
|
case StorageType.SqlGuid:
|
|
case StorageType.SqlInt16:
|
|
case StorageType.SqlInt32:
|
|
case StorageType.SqlInt64:
|
|
case StorageType.SqlMoney:
|
|
case StorageType.SqlSingle:
|
|
case StorageType.SqlString:
|
|
throw ExceptionBuilder.ConvertFailed(valueType, type);
|
|
default: // source is CLR type
|
|
if (StorageType.String == stype) { // destination is string
|
|
switch(vtype) { // source's type
|
|
case StorageType.Boolean:
|
|
return ((IConvertible)(bool)value).ToString(formatProvider);
|
|
case StorageType.Char:
|
|
return ((IConvertible)(Char)value).ToString(formatProvider);
|
|
case StorageType.SByte:
|
|
return ((IConvertible)(SByte)value).ToString(formatProvider);
|
|
case StorageType.Byte:
|
|
return ((IConvertible)(Byte)value).ToString(formatProvider);
|
|
case StorageType.Int16:
|
|
return ((IConvertible)(Int16)value).ToString(formatProvider);
|
|
case StorageType.UInt16:
|
|
return ((IConvertible)(UInt16)value).ToString(formatProvider);
|
|
case StorageType.Int32:
|
|
return ((IConvertible)(Int32)value).ToString(formatProvider);
|
|
case StorageType.UInt32:
|
|
return ((IConvertible)(UInt32)value).ToString(formatProvider);
|
|
case StorageType.Int64:
|
|
return ((IConvertible)(Int64)value).ToString(formatProvider);
|
|
case StorageType.UInt64:
|
|
return ((IConvertible)(UInt64)value).ToString(formatProvider);
|
|
case StorageType.Single:
|
|
return ((IConvertible)(Single)value).ToString(formatProvider);
|
|
case StorageType.Double:
|
|
return ((IConvertible)(Double)value).ToString(formatProvider);
|
|
case StorageType.Decimal:
|
|
return ((IConvertible)(Decimal)value).ToString(formatProvider);
|
|
case StorageType.DateTime:
|
|
return ((IConvertible)(DateTime)value).ToString(formatProvider);
|
|
//return XmlConvert.ToString((DateTime) value, XmlDateTimeSerializationMode.RoundtripKind);
|
|
case StorageType.TimeSpan:
|
|
return XmlConvert.ToString((TimeSpan) value);
|
|
case StorageType.Guid:
|
|
return XmlConvert.ToString((Guid) value);
|
|
case StorageType.String:
|
|
return (string)value;
|
|
case StorageType.CharArray:
|
|
return new string((char[])value);
|
|
case StorageType.DateTimeOffset:
|
|
return ((DateTimeOffset)value).ToString(formatProvider);
|
|
case StorageType.BigInteger:
|
|
break;
|
|
default:
|
|
IConvertible iconvertible = (value as IConvertible);
|
|
if (null != iconvertible) {
|
|
return iconvertible.ToString(formatProvider);
|
|
}
|
|
// catch additional classes like Guid
|
|
IFormattable iformattable = (value as IFormattable);
|
|
if (null != iformattable) {
|
|
return iformattable.ToString((string)null, formatProvider);
|
|
}
|
|
return value.ToString();
|
|
}
|
|
}
|
|
else if (StorageType.TimeSpan == stype) { // destination is TimeSpan
|
|
//WebData 110216, Handle TimeSpan convert the same way as we handle in storage
|
|
switch(vtype) {
|
|
case StorageType.String:
|
|
return XmlConvert.ToTimeSpan((string) value);
|
|
case StorageType.Int32:
|
|
return new TimeSpan((Int64)(Int32)value);
|
|
case StorageType.Int64:
|
|
return new TimeSpan((Int64)value);
|
|
default:
|
|
return (TimeSpan) value;
|
|
}
|
|
}
|
|
else if (StorageType.DateTimeOffset == stype) { // destination is DateTimeOffset
|
|
return (DateTimeOffset) value;
|
|
}
|
|
else if (StorageType.String == vtype){ // if source is string
|
|
switch(stype) { // type of destination
|
|
case StorageType.String:
|
|
return (string)value;
|
|
case StorageType.Boolean:
|
|
if ("1" == (string)value) return true;
|
|
if ("0" == (string)value) return false;
|
|
break;
|
|
case StorageType.Char:
|
|
return ((IConvertible)(string)value).ToChar(formatProvider);
|
|
case StorageType.SByte:
|
|
return ((IConvertible)(string)value).ToSByte(formatProvider);
|
|
case StorageType.Byte:
|
|
return ((IConvertible)(string)value).ToByte(formatProvider);
|
|
case StorageType.Int16:
|
|
return ((IConvertible)(string)value).ToInt16(formatProvider);
|
|
case StorageType.UInt16:
|
|
return ((IConvertible)(string)value).ToUInt16(formatProvider);
|
|
case StorageType.Int32:
|
|
return ((IConvertible)(string)value).ToInt32(formatProvider);
|
|
case StorageType.UInt32:
|
|
return ((IConvertible)(string)value).ToUInt32(formatProvider);
|
|
case StorageType.Int64:
|
|
return ((IConvertible)(string)value).ToInt64(formatProvider);
|
|
case StorageType.UInt64:
|
|
return ((IConvertible)(string)value).ToUInt64(formatProvider);
|
|
case StorageType.Single:
|
|
return ((IConvertible)(string)value).ToSingle(formatProvider);
|
|
case StorageType.Double:
|
|
return ((IConvertible)(string)value).ToDouble(formatProvider);
|
|
case StorageType.Decimal:
|
|
return ((IConvertible)(string)value).ToDecimal(formatProvider);
|
|
case StorageType.DateTime:
|
|
return ((IConvertible)(string)value).ToDateTime(formatProvider);
|
|
//return XmlConvert.ToDateTime((string) value, XmlDateTimeSerializationMode.RoundtripKind);
|
|
case StorageType.TimeSpan:
|
|
return XmlConvert.ToTimeSpan((string) value);
|
|
case StorageType.Guid:
|
|
return XmlConvert.ToGuid((string) value);
|
|
case StorageType.Uri:
|
|
return new Uri((string) value);
|
|
default: // other clr types,
|
|
break;
|
|
}
|
|
}
|
|
return Convert.ChangeType(value, type, formatProvider);
|
|
}
|
|
}
|
|
}
|
|
|
|
// this should be called for XmlSerialization
|
|
public static object ChangeTypeForXML(object value, Type type) {
|
|
Debug.Assert(value is string || type == typeof(string) , "invalid call to ChangeTypeForXML");
|
|
StorageType destinationType = DataStorage.GetStorageType(type);
|
|
Type valueType = value.GetType();
|
|
StorageType vtype = DataStorage.GetStorageType(valueType);
|
|
|
|
switch(destinationType) { // if destination is not string
|
|
case StorageType.SqlBinary:
|
|
return new SqlBinary(Convert.FromBase64String((string)value));
|
|
case StorageType.SqlBoolean:
|
|
return new SqlBoolean(XmlConvert.ToBoolean((string)value));
|
|
case StorageType.SqlByte:
|
|
return new SqlByte(XmlConvert.ToByte((string)value));
|
|
case StorageType.SqlBytes:
|
|
return new SqlBytes(Convert.FromBase64String((string)value));
|
|
case StorageType.SqlChars:
|
|
return new SqlChars(((string)value).ToCharArray());
|
|
case StorageType.SqlDateTime:
|
|
return new SqlDateTime(XmlConvert.ToDateTime((string)value, XmlDateTimeSerializationMode.RoundtripKind));
|
|
case StorageType.SqlDecimal:
|
|
return SqlDecimal.Parse((string)value); // parses invariant format and is larger has larger range then Decimal
|
|
case StorageType.SqlDouble:
|
|
return new SqlDouble(XmlConvert.ToDouble((string)value));
|
|
case StorageType.SqlGuid:
|
|
return new SqlGuid(XmlConvert.ToGuid((string)value));
|
|
case StorageType.SqlInt16:
|
|
return new SqlInt16(XmlConvert.ToInt16((string)value));
|
|
case StorageType.SqlInt32:
|
|
return new SqlInt32(XmlConvert.ToInt32((string)value));
|
|
case StorageType.SqlInt64:
|
|
return new SqlInt64(XmlConvert.ToInt64((string)value));
|
|
case StorageType.SqlMoney:
|
|
return new SqlMoney(XmlConvert.ToDecimal((string)value));
|
|
case StorageType.SqlSingle:
|
|
return new SqlSingle(XmlConvert.ToSingle((string)value));
|
|
case StorageType.SqlString:
|
|
return new SqlString((string)value);
|
|
// case StorageType.SqlXml: // What to do
|
|
// if (DataStorage.IsObjectNull(value)) {
|
|
// return SqlXml.Null;
|
|
// }
|
|
// goto default;
|
|
case StorageType.Boolean:
|
|
if ("1" == (string)value) return true;
|
|
if ("0" == (string)value) return false;
|
|
return XmlConvert.ToBoolean((string) value);
|
|
case StorageType.Char:
|
|
return XmlConvert.ToChar((string) value);
|
|
case StorageType.SByte:
|
|
return XmlConvert.ToSByte((string) value);
|
|
case StorageType.Byte:
|
|
return XmlConvert.ToByte((string) value);
|
|
case StorageType.Int16:
|
|
return XmlConvert.ToInt16((string) value);
|
|
case StorageType.UInt16:
|
|
return XmlConvert.ToUInt16((string) value);
|
|
case StorageType.Int32:
|
|
return XmlConvert.ToInt32((string) value);
|
|
case StorageType.UInt32:
|
|
return XmlConvert.ToUInt32((string) value);
|
|
case StorageType.Int64:
|
|
return XmlConvert.ToInt64((string) value);
|
|
case StorageType.UInt64:
|
|
return XmlConvert.ToUInt64((string) value);
|
|
case StorageType.Single:
|
|
return XmlConvert.ToSingle((string) value);
|
|
case StorageType.Double:
|
|
return XmlConvert.ToDouble((string) value);
|
|
case StorageType.Decimal:
|
|
return XmlConvert.ToDecimal((string) value);
|
|
case StorageType.DateTime:
|
|
return XmlConvert.ToDateTime((string)value, XmlDateTimeSerializationMode.RoundtripKind);
|
|
case StorageType.Guid:
|
|
return XmlConvert.ToGuid((string) value);
|
|
case StorageType.Uri:
|
|
return new Uri((string) value);
|
|
case StorageType.DateTimeOffset:
|
|
return XmlConvert.ToDateTimeOffset((string)value);
|
|
case StorageType.TimeSpan:
|
|
//WebData 110216, Handle TimeSpan convert the same way as we handle in storage
|
|
switch(vtype) {
|
|
case StorageType.String:
|
|
return XmlConvert.ToTimeSpan((string) value);
|
|
case StorageType.Int32:
|
|
return new TimeSpan((Int64)(Int32)value);
|
|
case StorageType.Int64:
|
|
return new TimeSpan((Int64)value);
|
|
default:
|
|
return (TimeSpan) value;
|
|
}
|
|
default: {
|
|
if ((DBNull.Value == value) || (null == value)) {
|
|
return DBNull.Value;
|
|
}
|
|
|
|
switch(vtype) { // To String
|
|
case StorageType.SqlBinary:
|
|
return Convert.ToBase64String(((SqlBinary)value).Value);
|
|
case StorageType.SqlBoolean:
|
|
return XmlConvert.ToString(((SqlBoolean)value).Value);
|
|
case StorageType.SqlByte:
|
|
return XmlConvert.ToString(((SqlByte)value).Value);
|
|
case StorageType.SqlBytes:
|
|
return Convert.ToBase64String(((SqlBytes)value).Value);
|
|
case StorageType.SqlChars:
|
|
return new string(((SqlChars)value).Value);
|
|
case StorageType.SqlDateTime:
|
|
return XmlConvert.ToString(((SqlDateTime)value).Value, XmlDateTimeSerializationMode.RoundtripKind);
|
|
case StorageType.SqlDecimal:
|
|
return ((SqlDecimal)value).ToString(); // converts using invariant format and is larger has larger range then Decimal
|
|
case StorageType.SqlDouble:
|
|
return XmlConvert.ToString(((SqlDouble)value).Value);
|
|
case StorageType.SqlGuid:
|
|
return XmlConvert.ToString(((SqlGuid)value).Value);
|
|
case StorageType.SqlInt16:
|
|
return XmlConvert.ToString(((SqlInt16)value).Value);
|
|
case StorageType.SqlInt32:
|
|
return XmlConvert.ToString(((SqlInt32)value).Value);
|
|
case StorageType.SqlInt64:
|
|
return XmlConvert.ToString(((SqlInt64)value).Value);
|
|
case StorageType.SqlMoney:
|
|
return XmlConvert.ToString(((SqlMoney)value).Value);
|
|
case StorageType.SqlSingle:
|
|
return XmlConvert.ToString(((SqlSingle)value).Value);
|
|
case StorageType.SqlString:
|
|
return ((SqlString)value).Value;
|
|
case StorageType.Boolean:
|
|
return XmlConvert.ToString((bool) value);
|
|
case StorageType.Char:
|
|
return XmlConvert.ToString((Char) value);
|
|
case StorageType.SByte:
|
|
return XmlConvert.ToString((SByte) value);
|
|
case StorageType.Byte:
|
|
return XmlConvert.ToString((Byte) value);
|
|
case StorageType.Int16:
|
|
return XmlConvert.ToString((Int16) value);
|
|
case StorageType.UInt16:
|
|
return XmlConvert.ToString((UInt16) value);
|
|
case StorageType.Int32:
|
|
return XmlConvert.ToString((Int32) value);
|
|
case StorageType.UInt32:
|
|
return XmlConvert.ToString((UInt32) value);
|
|
case StorageType.Int64:
|
|
return XmlConvert.ToString((Int64) value);
|
|
case StorageType.UInt64:
|
|
return XmlConvert.ToString((UInt64) value);
|
|
case StorageType.Single:
|
|
return XmlConvert.ToString((Single) value);
|
|
case StorageType.Double:
|
|
return XmlConvert.ToString((Double) value);
|
|
case StorageType.Decimal:
|
|
return XmlConvert.ToString((Decimal) value);
|
|
case StorageType.DateTime:
|
|
return XmlConvert.ToString((DateTime)value, XmlDateTimeSerializationMode.RoundtripKind);
|
|
case StorageType.TimeSpan:
|
|
return XmlConvert.ToString((TimeSpan) value);
|
|
case StorageType.Guid:
|
|
return XmlConvert.ToString((Guid) value);
|
|
case StorageType.String:
|
|
return (string)value;
|
|
case StorageType.CharArray:
|
|
return new string((char[])value);
|
|
case StorageType.DateTimeOffset:
|
|
return XmlConvert.ToString((DateTimeOffset)value);
|
|
default:
|
|
IConvertible iconvertible = (value as IConvertible);
|
|
if (null != iconvertible) {
|
|
return iconvertible.ToString(System.Globalization.CultureInfo.InvariantCulture);
|
|
}
|
|
// catch additional classes like Guid
|
|
IFormattable iformattable = (value as IFormattable);
|
|
if (null != iformattable) {
|
|
return iformattable.ToString((string)null, System.Globalization.CultureInfo.InvariantCulture);
|
|
}
|
|
return value.ToString();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|