/// <summary>
        ///     Creates a SQLiteParameter given a name, type, and direction
        /// </summary>
        internal static SQLiteParameter CreateSQLiteParameter(string name, TypeUsage type, ParameterMode mode,
                                                              object value)
        {
            int?size;

            if (type.GetPrimitiveTypeKind() == PrimitiveTypeKind.Guid)
            {
                type = TypeUsage.CreateStringTypeUsage(
                    PrimitiveType.GetEdmPrimitiveType(PrimitiveTypeKind.String),
                    false, true);
            }

            var result = new SQLiteParameter(name, value);

            // .Direction
            var direction = MetadataHelpers.ParameterModeToParameterDirection(mode);

            if (result.Direction != direction)
            {
                result.Direction = direction;
            }

            // .Size and .DbType
            // output parameters are handled differently (we need to ensure there is space for return
            // values where the user has not given a specific Size/MaxLength)
            var isOutParam = mode != ParameterMode.In;
            var sqlDbType  = GetSQLiteDbType(type, isOutParam, out size);

            if (result.DbType != sqlDbType)
            {
                result.DbType = sqlDbType;
            }

            // Note that we overwrite 'facet' parameters where either the value is different or
            // there is an output parameter.
            if (size.HasValue && (isOutParam || result.Size != size.Value))
            {
                result.Size = size.Value;
            }

            // .IsNullable
            var isNullable = type.GetIsNullable();

            if (isOutParam || isNullable != result.IsNullable)
            {
                result.IsNullable = isNullable;
            }

            return(result);
        }
Exemple #2
0
        /// <summary>
        /// Determines DbType for the given primitive type. Extracts facet
        /// information as well.
        /// </summary>
        private static DbType GetSQLiteDbType(TypeUsage type, bool isOutParam, out int?size)
        {
            // only supported for primitive type
            PrimitiveTypeKind primitiveTypeKind = type.GetPrimitiveTypeKind();

            size = default(int?);

            switch (primitiveTypeKind)
            {
            case PrimitiveTypeKind.Binary:
                // for output parameters, ensure there is space...
                size = GetParameterSize(type, isOutParam);
                return(GetBinaryDbType(type));

            case PrimitiveTypeKind.Boolean:
                return(DbType.Boolean);

            case PrimitiveTypeKind.Byte:
                return(DbType.Byte);

            case PrimitiveTypeKind.Time:
                return(DbType.Time);

            case PrimitiveTypeKind.DateTimeOffset:
                return(DbType.DateTimeOffset);

            case PrimitiveTypeKind.DateTime:
                return(DbType.DateTime);

            case PrimitiveTypeKind.Decimal:
                return(DbType.Decimal);

            case PrimitiveTypeKind.Double:
                return(DbType.Double);

            case PrimitiveTypeKind.Guid:
                return(DbType.Guid);

            case PrimitiveTypeKind.Int16:
                return(DbType.Int16);

            case PrimitiveTypeKind.Int32:
                return(DbType.Int32);

            case PrimitiveTypeKind.Int64:
                return(DbType.Int64);

            case PrimitiveTypeKind.SByte:
                return(DbType.SByte);

            case PrimitiveTypeKind.Single:
                return(DbType.Single);

            case PrimitiveTypeKind.String:
                size = GetParameterSize(type, isOutParam);
                return(GetStringDbType(type));

            default:
                throw new InvalidOperationException("unknown PrimitiveTypeKind " + primitiveTypeKind);
            }
        }
        /// <summary>
        /// Determines SqlDbType for the given primitive type. Extracts facet
        /// information as well.
        /// </summary>
        private static OleDbType GetJetDbType(TypeUsage type, bool isOutParam, out int?size, out string udtName)
        {
            // only supported for primitive type
            PrimitiveTypeKind primitiveTypeKind = type.GetPrimitiveTypeKind();

            size    = default(int?);
            udtName = null;

            // TODO add logic for Xml here
            switch (primitiveTypeKind)
            {
            case PrimitiveTypeKind.Binary:
                // for output parameters, ensure there is space...
                size = GetParameterSize(type, isOutParam);
                return(GetBinaryDbType(type));

            case PrimitiveTypeKind.Boolean:
                return(OleDbType.Boolean);

            case PrimitiveTypeKind.Byte:
                return(OleDbType.TinyInt);

            case PrimitiveTypeKind.Time:
                return(OleDbType.Date);

            case PrimitiveTypeKind.DateTimeOffset:
                return(OleDbType.Date);

            case PrimitiveTypeKind.DateTime:
                return(OleDbType.Date);

            case PrimitiveTypeKind.Decimal:
                return(OleDbType.Decimal);

            case PrimitiveTypeKind.Double:
                return(OleDbType.Double);

            case PrimitiveTypeKind.Guid:
                return(OleDbType.Guid);

            case PrimitiveTypeKind.Int16:
                return(OleDbType.SmallInt);

            case PrimitiveTypeKind.Int32:
                return(OleDbType.Integer);

            case PrimitiveTypeKind.Int64:
                return(OleDbType.BigInt);

            case PrimitiveTypeKind.SByte:
                return(OleDbType.SmallInt);

            case PrimitiveTypeKind.Single:
                return(OleDbType.Single);

            case PrimitiveTypeKind.String:
                size = GetParameterSize(type, isOutParam);
                return(GetStringDbType(type));

            default:
                throw new InvalidOperationException("unknown PrimitiveTypeKind " + primitiveTypeKind);
            }
        }