/******************************************************** * ADO.NET 2.0 Data Provider for SQLite Version 3.X * Written by Robert Simpson (robert@blackcastlesoft.com) * * Released to the public domain, use at your own risk! ********************************************************/ namespace System.Data.SQLite { using System; using System.Data; using System.Data.Common; using System.ComponentModel; /// /// SQLite implementation of DbParameter. /// public sealed class SQLiteParameter : DbParameter, ICloneable { /// /// The data type of the parameter /// internal int _dbType; /// /// The version information for mapping the parameter /// private DataRowVersion _rowVersion; /// /// The value of the data in the parameter /// private Object _objValue; /// /// The source column for the parameter /// private string _sourceColumn; /// /// The column name /// private string _parameterName; /// /// The data size, unused by SQLite /// private int _dataSize; private bool _nullable; private bool _nullMapping; /// /// Default constructor /// public SQLiteParameter() : this(null, (DbType)(-1), 0, null, DataRowVersion.Current) { } /// /// Constructs a named parameter given the specified parameter name /// /// The parameter name public SQLiteParameter(string parameterName) : this(parameterName, (DbType)(-1), 0, null, DataRowVersion.Current) { } /// /// Constructs a named parameter given the specified parameter name and initial value /// /// The parameter name /// The initial value of the parameter public SQLiteParameter(string parameterName, object value) : this(parameterName, (DbType)(-1), 0, null, DataRowVersion.Current) { Value = value; } /// /// Constructs a named parameter of the specified type /// /// The parameter name /// The datatype of the parameter public SQLiteParameter(string parameterName, DbType dbType) : this(parameterName, dbType, 0, null, DataRowVersion.Current) { } /// /// Constructs a named parameter of the specified type and source column reference /// /// The parameter name /// The data type /// The source column public SQLiteParameter(string parameterName, DbType dbType, string sourceColumn) : this(parameterName, dbType, 0, sourceColumn, DataRowVersion.Current) { } /// /// Constructs a named parameter of the specified type, source column and row version /// /// The parameter name /// The data type /// The source column /// The row version information public SQLiteParameter(string parameterName, DbType dbType, string sourceColumn, DataRowVersion rowVersion) : this(parameterName, dbType, 0, sourceColumn, rowVersion) { } /// /// Constructs an unnamed parameter of the specified data type /// /// The datatype of the parameter public SQLiteParameter(DbType dbType) : this(null, dbType, 0, null, DataRowVersion.Current) { } /// /// Constructs an unnamed parameter of the specified data type and sets the initial value /// /// The datatype of the parameter /// The initial value of the parameter public SQLiteParameter(DbType dbType, object value) : this(null, dbType, 0, null, DataRowVersion.Current) { Value = value; } /// /// Constructs an unnamed parameter of the specified data type and source column /// /// The datatype of the parameter /// The source column public SQLiteParameter(DbType dbType, string sourceColumn) : this(null, dbType, 0, sourceColumn, DataRowVersion.Current) { } /// /// Constructs an unnamed parameter of the specified data type, source column and row version /// /// The data type /// The source column /// The row version information public SQLiteParameter(DbType dbType, string sourceColumn, DataRowVersion rowVersion) : this(null, dbType, 0, sourceColumn, rowVersion) { } /// /// Constructs a named parameter of the specified type and size /// /// The parameter name /// The data type /// The size of the parameter public SQLiteParameter(string parameterName, DbType parameterType, int parameterSize) : this(parameterName, parameterType, parameterSize, null, DataRowVersion.Current) { } /// /// Constructs a named parameter of the specified type, size and source column /// /// The name of the parameter /// The data type /// The size of the parameter /// The source column public SQLiteParameter(string parameterName, DbType parameterType, int parameterSize, string sourceColumn) : this(parameterName, parameterType, parameterSize, sourceColumn, DataRowVersion.Current) { } /// /// Constructs a named parameter of the specified type, size, source column and row version /// /// The name of the parameter /// The data type /// The size of the parameter /// The source column /// The row version information public SQLiteParameter(string parameterName, DbType parameterType, int parameterSize, string sourceColumn, DataRowVersion rowVersion) { _parameterName = parameterName; _dbType = (int)parameterType; _sourceColumn = sourceColumn; _rowVersion = rowVersion; _objValue = null; _dataSize = parameterSize; _nullMapping = false; _nullable = true; } private SQLiteParameter(SQLiteParameter source) : this(source.ParameterName, (DbType)source._dbType, 0, source.Direction, source.IsNullable, 0, 0, source.SourceColumn, source.SourceVersion, source.Value) { _nullMapping = source._nullMapping; } /// /// Constructs a named parameter of the specified type, size, source column and row version /// /// The name of the parameter /// The data type /// The size of the parameter /// Only input parameters are supported in SQLite /// Ignored /// Ignored /// Ignored /// The source column /// The row version information /// The initial value to assign the parameter #if !PLATFORM_COMPACTFRAMEWORK [EditorBrowsable(EditorBrowsableState.Advanced)] #endif public SQLiteParameter(string parameterName, DbType parameterType, int parameterSize, ParameterDirection direction, bool isNullable, byte precision, byte scale, string sourceColumn, DataRowVersion rowVersion, object value) : this(parameterName, parameterType, parameterSize, sourceColumn, rowVersion) { Direction = direction; IsNullable = isNullable; Value = value; } /// /// Constructs a named parameter, yet another flavor /// /// The name of the parameter /// The data type /// The size of the parameter /// Only input parameters are supported in SQLite /// Ignored /// Ignored /// The source column /// The row version information /// Whether or not this parameter is for comparing NULL's /// The intial value to assign the parameter #if !PLATFORM_COMPACTFRAMEWORK [EditorBrowsable(EditorBrowsableState.Advanced)] #endif public SQLiteParameter(string parameterName, DbType parameterType, int parameterSize, ParameterDirection direction, byte precision, byte scale, string sourceColumn, DataRowVersion rowVersion, bool sourceColumnNullMapping, object value) : this(parameterName, parameterType, parameterSize, sourceColumn, rowVersion) { Direction = direction; SourceColumnNullMapping = sourceColumnNullMapping; Value = value; } /// /// Constructs an unnamed parameter of the specified type and size /// /// The data type /// The size of the parameter public SQLiteParameter(DbType parameterType, int parameterSize) : this(null, parameterType, parameterSize, null, DataRowVersion.Current) { } /// /// Constructs an unnamed parameter of the specified type, size, and source column /// /// The data type /// The size of the parameter /// The source column public SQLiteParameter(DbType parameterType, int parameterSize, string sourceColumn) : this(null, parameterType, parameterSize, sourceColumn, DataRowVersion.Current) { } /// /// Constructs an unnamed parameter of the specified type, size, source column and row version /// /// The data type /// The size of the parameter /// The source column /// The row version information public SQLiteParameter(DbType parameterType, int parameterSize, string sourceColumn, DataRowVersion rowVersion) : this(null, parameterType, parameterSize, sourceColumn, rowVersion) { } /// /// Whether or not the parameter can contain a null value /// public override bool IsNullable { get { return _nullable; } set { _nullable = value; } } /// /// Returns the datatype of the parameter /// #if !PLATFORM_COMPACTFRAMEWORK [DbProviderSpecificTypeProperty(true)] [RefreshProperties(RefreshProperties.All)] #endif public override DbType DbType { get { if (_dbType == -1) return DbType.String; // Unassigned default value is String return (DbType)_dbType; } set { _dbType = (int)value; } } /// /// Supports only input parameters /// public override ParameterDirection Direction { get { return ParameterDirection.Input; } set { if (value != ParameterDirection.Input) throw new NotSupportedException(); } } /// /// Returns the parameter name /// public override string ParameterName { get { return _parameterName; } set { _parameterName = value; } } /// /// Not implemented /// public override void ResetDbType() { } /// /// Returns the size of the parameter /// #if !PLATFORM_COMPACTFRAMEWORK [DefaultValue((int)0)] #endif public override int Size { get { return _dataSize; } set { _dataSize = value; } } /// /// Gets/sets the source column /// public override string SourceColumn { get { return _sourceColumn; } set { _sourceColumn = value; } } /// /// Used by DbCommandBuilder to determine the mapping for nullable fields /// public override bool SourceColumnNullMapping { get { return _nullMapping; } set { _nullMapping = value; } } /// /// Gets and sets the row version /// public override DataRowVersion SourceVersion { get { return _rowVersion; } set { _rowVersion = value; } } /// /// Gets and sets the parameter value. If no datatype was specified, the datatype will assume the type from the value given. /// #if !PLATFORM_COMPACTFRAMEWORK [TypeConverter(typeof(StringConverter)), RefreshProperties(RefreshProperties.All)] #endif public override object Value { get { return _objValue; } set { _objValue = value; if (_dbType == -1 && _objValue != null && _objValue != DBNull.Value) // If the DbType has never been assigned, try to glean one from the value's datatype _dbType = (int)SQLiteConvert.TypeToDbType(_objValue.GetType()); } } /// /// Clones a parameter /// /// A new, unassociated SQLiteParameter public object Clone() { SQLiteParameter newparam = new SQLiteParameter(this); return newparam; } } }