public void TryGetAdoTypeForClrType_TypeNull_ThrowsArgumentNullException()
        {
            Type type   = null;
            var  actual = new ADODB.DataTypeEnum();

            Assert.Throws <ArgumentNullException>(() => DataTypes.TryGetAdoTypeForClrType(type, out actual));
        }
        public void TryGetAdoTypeForClrType_UnsupportedType_IsNotConverted()
        {
            bool expected = false;

            var  type   = new ADODB.DataTypeEnum();
            bool actual = DataTypes.TryGetAdoTypeForClrType(typeof(object), out type);

            Assert.Equal(expected, actual);
        }
        protected ADODB.DataTypeEnum DbTypeToDataType(DbType t)
        {
            ADODB.DataTypeEnum ret = ADODB.DataTypeEnum.adChar;

            switch (t)
            {
            case DbType.AnsiString: ret = ADODB.DataTypeEnum.adChar; break;

            case DbType.Binary: ret = ADODB.DataTypeEnum.adBinary; break;

            case DbType.Boolean: ret = ADODB.DataTypeEnum.adBoolean; break;

            case DbType.Byte: ret = ADODB.DataTypeEnum.adUnsignedTinyInt; break;

            case DbType.Currency: ret = ADODB.DataTypeEnum.adCurrency; break;

            case DbType.Date: ret = ADODB.DataTypeEnum.adDate; break;

            case DbType.DateTime: ret = ADODB.DataTypeEnum.adDBTimeStamp; break;

            case DbType.Decimal: ret = ADODB.DataTypeEnum.adDecimal; break;

            case DbType.Double: ret = ADODB.DataTypeEnum.adDouble; break;

            case DbType.Guid: ret = ADODB.DataTypeEnum.adGUID; break;

            case DbType.Int16: ret = ADODB.DataTypeEnum.adSmallInt; break;

            case DbType.Int32: ret = ADODB.DataTypeEnum.adInteger; break;

            case DbType.Int64: ret = ADODB.DataTypeEnum.adBigInt; break;

            case DbType.Object: ret = ADODB.DataTypeEnum.adUserDefined; break;

            case DbType.SByte: ret = ADODB.DataTypeEnum.adTinyInt; break;

            case DbType.Single: ret = ADODB.DataTypeEnum.adSingle; break;

            case DbType.String: ret = ADODB.DataTypeEnum.adVarWChar; break;

            case DbType.StringFixedLength: ret = ADODB.DataTypeEnum.adWChar; break;

            case DbType.Time: ret = ADODB.DataTypeEnum.adDBTime; break;

            case DbType.UInt16: ret = ADODB.DataTypeEnum.adUnsignedSmallInt; break;

            case DbType.UInt32: ret = ADODB.DataTypeEnum.adUnsignedInt; break;

            case DbType.UInt64: ret = ADODB.DataTypeEnum.adUnsignedBigInt; break;

            case DbType.VarNumeric: ret = ADODB.DataTypeEnum.adVarNumeric; break;

            default: throw new ArgumentOutOfRangeException("t");
            }

            return(ret);
        }
        public void TryGetAdoTypeForClrType_SupportedType_IsConverted()
        {
            var expected = ADODB.DataTypeEnum.adBoolean;

            var actual = new ADODB.DataTypeEnum();

            DataTypes.TryGetAdoTypeForClrType(typeof(bool), out actual);

            Assert.Equal(expected, actual);
        }
        /// <summary>
        /// Get the appropriate ADODB type for a given CLR type.
        /// </summary>
        /// <param name="clrType">The CLR type to look for.</param>
        /// <param name="adoType">The ADODB type that matches the CLR type, if any.</param>
        /// <returns>True if an ADODB type was found.</returns>
        public static bool TryGetAdoTypeForClrType(Type clrType, out ADODB.DataTypeEnum adoType)
        {
            var type = clrType;

            if (type != null && clrType.IsGenericType && clrType.GetGenericTypeDefinition() == typeof(Nullable <>))
            {
                type = Nullable.GetUnderlyingType(clrType);
            }

            return(Types.TryGetValue(type, out adoType));
        }
        /// <summary>
        /// Creates an ADODB.Recordset from an System.Collections.Generic.IEnumerable(T).
        /// </summary>
        /// <typeparam name="T">The type of the elements of input.</typeparam>
        /// <param name="input">The System.Collections.Generic.IEnumerable(T) to create an ADODB.Recordset from.</param>
        /// <returns>An ADODB.Recordset that contains elements from the input sequence.</returns>
        public static ADODB.Recordset ToRecordset <T>(this IEnumerable <T> input)
        {
            var adoType = new ADODB.DataTypeEnum();

            if (DataTypes.TryGetAdoTypeForClrType(typeof(T), out adoType))
            {
                throw new ArgumentException("The T of IEnumerable<T> must be a custom POCO, not an ADO compatible type.", "input");
            }

            var rs   = new ADODB.Recordset();
            var type = typeof(T);

            BindingFlags flags = BindingFlags.Public | BindingFlags.Instance;

            PropertyInfo[] properties = type.GetProperties(flags);

            // create properties
            foreach (var property in properties)
            {
                if (DataTypes.TryGetAdoTypeForClrType(property.PropertyType, out adoType))
                {
                    int definedSize = 0;

                    if (property.PropertyType == typeof(string))
                    {
                        // TODO: set string size to length of longest string in POCO?
                        definedSize = 1000;
                    }

                    if (property.PropertyType == typeof(Guid))
                    {
                        definedSize = 38;
                    }

                    rs.Fields.Append(property.Name, adoType, definedSize, ADODB.FieldAttributeEnum.adFldIsNullable);
                }
            }

            // insert data
            rs.Open();

            if (input.Any())
            {
                foreach (var item in input)
                {
                    rs.AddNew();

                    foreach (var property in properties)
                    {
                        var value = property.GetValue(item, null);

                        if (property.PropertyType == typeof(Guid))
                        {
                            value = value.ToString();
                        }

                        if (value != null)
                        {
                            rs.Fields[property.Name].Value = value;
                        }
                    }

                    rs.Update();
                }
            }

            return(rs);
        }
        private DbType GetDbType(ADODB.DataTypeEnum type)
        {
            switch (type)
            {
            case ADODB.DataTypeEnum.adBigInt: return(DbType.Int64);

            case ADODB.DataTypeEnum.adBinary: return(DbType.Binary);

            case ADODB.DataTypeEnum.adBoolean: return(DbType.Boolean);

            case ADODB.DataTypeEnum.adBSTR: return(DbType.AnsiString);

            case ADODB.DataTypeEnum.adChapter: return(DbType.Object);    // TODO: Investigate data type.

            case ADODB.DataTypeEnum.adChar: return(DbType.AnsiStringFixedLength);

            case ADODB.DataTypeEnum.adCurrency: return(DbType.Currency);

            case ADODB.DataTypeEnum.adDate: return(DbType.DateTime);

            case ADODB.DataTypeEnum.adDBDate: return(DbType.DateTime);

            case ADODB.DataTypeEnum.adDBTime: return(DbType.Time);

            case ADODB.DataTypeEnum.adDBTimeStamp: return(DbType.Binary);

            case ADODB.DataTypeEnum.adDecimal: return(DbType.Decimal);

            case ADODB.DataTypeEnum.adDouble: return(DbType.Decimal);

            case ADODB.DataTypeEnum.adEmpty: return(DbType.Object);    // TODO: Investigate data type.

            case ADODB.DataTypeEnum.adError: return(DbType.Object);    // TODO: Investigate data type.

            case ADODB.DataTypeEnum.adFileTime: return(DbType.Object); // TODO: Investigate data type.

            case ADODB.DataTypeEnum.adGUID: return(DbType.Guid);

            case ADODB.DataTypeEnum.adIDispatch: return(DbType.Object);    // TODO: Investigate data type.

            case ADODB.DataTypeEnum.adInteger: return(DbType.Int32);

            case ADODB.DataTypeEnum.adIUnknown: return(DbType.Object);    // TODO: Investigate data type.

            case ADODB.DataTypeEnum.adLongVarBinary: return(DbType.Binary);

            case ADODB.DataTypeEnum.adLongVarChar: return(DbType.String);

            case ADODB.DataTypeEnum.adLongVarWChar: return(DbType.String);

            case ADODB.DataTypeEnum.adNumeric: return(DbType.Decimal);

            case ADODB.DataTypeEnum.adPropVariant: return(DbType.Object);

            case ADODB.DataTypeEnum.adSingle: return(DbType.Decimal);

            case ADODB.DataTypeEnum.adSmallInt: return(DbType.Int16);

            case ADODB.DataTypeEnum.adTinyInt: return(DbType.SByte);

            case ADODB.DataTypeEnum.adUnsignedBigInt: return(DbType.UInt64);

            case ADODB.DataTypeEnum.adUnsignedInt: return(DbType.UInt32);

            case ADODB.DataTypeEnum.adUnsignedSmallInt: return(DbType.UInt16);

            case ADODB.DataTypeEnum.adUnsignedTinyInt: return(DbType.Byte);

            case ADODB.DataTypeEnum.adUserDefined: return(DbType.Object);

            case ADODB.DataTypeEnum.adVarBinary: return(DbType.Binary);

            case ADODB.DataTypeEnum.adVarChar: return(DbType.AnsiString);

            case ADODB.DataTypeEnum.adVariant: return(DbType.Object);

            case ADODB.DataTypeEnum.adVarNumeric: return(DbType.Decimal);

            case ADODB.DataTypeEnum.adVarWChar: return(DbType.String);

            case ADODB.DataTypeEnum.adWChar: return(DbType.StringFixedLength);

            default: return(DbType.Object);
            }
        }
示例#8
0
 public static bool TryGetAdoTypeForClrType(Type clrType, out ADODB.DataTypeEnum adoType)
 {
     return(Types.TryGetValue(clrType, out adoType));
 }