using System; using System.Data; using System.Data.SqlClient; using System.Globalization; using SDA.DataProvider.Core; namespace SDA.DataProvider.MSSQLWrappers { class MSSQLCommandParameterWrapper : SDACommandParameterWrapper { internal SqlParameter Parameter; internal MSSQLCommandParameterWrapper(SqlParameter parameter) { Parameter = parameter; } protected override IDbDataParameter WrappedParameter { get { return Parameter; } } public override object Value { get { return Parameter.Value; } set { if (value is bool boolean) { Parameter.Value = boolean ? 'T' : 'F'; } else { Parameter.Value = value; } } } public override SDADBType DBType { get { return MSSQLParameterTypeConverter.ConvertSqlDbTypeToSDADBType(Parameter.SqlDbType); } set { Parameter.SqlDbType = MSSQLParameterTypeConverter.ConvertSDADBTypeToSqlDbType(value); } } } class MSSQLParameterTypeConverter { public static SqlDbType ConvertSDADBTypeToSqlDbType(SDADBType type) { switch (type) { case SDADBType.Int: return SqlDbType.Int; case SDADBType.String: return SqlDbType.NVarChar; case SDADBType.Binary: return SqlDbType.Image; case SDADBType.Char: return SqlDbType.NChar; case SDADBType.DateTime: return SqlDbType.DateTime; case SDADBType.Double: return SqlDbType.Float; case SDADBType.Boolean: return SqlDbType.Char; case SDADBType.LongString: return SqlDbType.NText; case SDADBType.LongInt: return SqlDbType.BigInt; case SDADBType.NonUnicodeString: return SqlDbType.VarChar; case SDADBType.Guid: return SqlDbType.UniqueIdentifier; default: throw new NotImplementedException(type.ToString()); } } public static SDADBType ConvertSqlDbTypeToSDADBType(SqlDbType type) { switch (type) { case SqlDbType.BigInt: return SDADBType.LongInt; case SqlDbType.Binary: return SDADBType.Binary; case SqlDbType.Bit: return SDADBType.Boolean; case SqlDbType.Char: return SDADBType.Char; case SqlDbType.DateTime: return SDADBType.DateTime; case SqlDbType.Decimal: throw new NotSupportedException(string.Format(CultureInfo.InvariantCulture, "Conversion from '{0}' is not supported.", type)); case SqlDbType.Float: return SDADBType.Double; case SqlDbType.Image: return SDADBType.Binary; case SqlDbType.Int: return SDADBType.Int; case SqlDbType.Money: throw new NotSupportedException(string.Format(CultureInfo.InvariantCulture, "Conversion from '{0}' is not supported.", type)); case SqlDbType.NChar: return SDADBType.Char; case SqlDbType.NText: return SDADBType.LongString; case SqlDbType.NVarChar: return SDADBType.String; case SqlDbType.Real: return SDADBType.Double; case SqlDbType.SmallDateTime: return SDADBType.DateTime; case SqlDbType.SmallInt: return SDADBType.Int; case SqlDbType.SmallMoney: throw new NotSupportedException(string.Format(CultureInfo.InvariantCulture, "Conversion from '{0}' is not supported.", type)); case SqlDbType.Text: return SDADBType.LongString; case SqlDbType.Timestamp: throw new NotSupportedException(string.Format(CultureInfo.InvariantCulture, "Conversion from '{0}' is not supported.", type)); case SqlDbType.TinyInt: throw new NotSupportedException(string.Format(CultureInfo.InvariantCulture, "Conversion from '{0}' is not supported.", type)); case SqlDbType.UniqueIdentifier: return SDADBType.Guid; case SqlDbType.VarBinary: throw new NotSupportedException(string.Format(CultureInfo.InvariantCulture, "Conversion from '{0}' is not supported.", type)); case SqlDbType.VarChar: return SDADBType.NonUnicodeString; case SqlDbType.Variant: throw new NotSupportedException(string.Format(CultureInfo.InvariantCulture, "Conversion from '{0}' is not supported.", type)); default: throw new NotImplementedException(type.ToString()); } } } }