/// <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); }
/// <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); } }