/********************************************************
* 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;
using System.Globalization;
///
/// SQLite implementation of DbParameter.
///
#if !PLATFORM_COMPACTFRAMEWORK
[TypeConverter(typeof(SQLiteParameterConverter))]
#endif
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 _columnName;
///
/// 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)
{
_columnName = parameterName;
_dbType = (int)parameterType;
_sourceColumn = sourceColumn;
_rowVersion = rowVersion;
_objValue = null;
_dataSize = parameterSize;
_nullMapping = false;
_nullable = true;
}
///
/// 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 _columnName;
}
set
{
_columnName = 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(ParameterName, this.DbType, Size, Direction, IsNullable, 0, 0, SourceColumn, SourceVersion, Value);
return newparam;
}
#if !PLATFORM_COMPACT_FRAMEWORK
internal sealed class SQLiteParameterConverter : ExpandableObjectConverter
{
public SQLiteParameterConverter()
{
}
public override bool CanConvertTo(ITypeDescriptorContext context, Type destinationType)
{
if (typeof(System.ComponentModel.Design.Serialization.InstanceDescriptor) == destinationType)
{
return true;
}
return base.CanConvertTo(context, destinationType);
}
public override object ConvertTo(ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType)
{
if (destinationType == null)
{
throw new ArgumentNullException();
}
if ((typeof(System.ComponentModel.Design.Serialization.InstanceDescriptor) == destinationType) && (value is SQLiteParameter))
{
return ConvertToInstanceDescriptor(value as SQLiteParameter);
}
return base.ConvertTo(context, culture, value, destinationType);
}
private System.ComponentModel.Design.Serialization.InstanceDescriptor ConvertToInstanceDescriptor(SQLiteParameter parameter)
{
Type[] types = null;
object[] parms = null;
if (parameter.SourceColumnNullMapping == true)
{
// (string parameterName, DbType parameterType, int parameterSize, ParameterDirection direction, byte precision, byte scale, string sourceColumn, DataRowVersion rowVersion, bool sourceColumnNullMapping, object value)
types = new Type[] { typeof(string), typeof(DbType), typeof(int), typeof(ParameterDirection), typeof(byte), typeof(byte), typeof(string), typeof(DataRowVersion), typeof(bool), typeof(object) };
parms = new object[] { parameter.ParameterName, (DbType)parameter._dbType, 0, parameter.Direction, 0, 0, parameter.SourceColumn, parameter.SourceVersion, parameter.SourceColumnNullMapping, parameter.Value };
}
else
{
// (string parameterName, DbType parameterType, int parameterSize, ParameterDirection direction, bool isNullable, byte precision, byte scale, string sourceColumn, DataRowVersion rowVersion, object value)
types = new Type[] { typeof(string), typeof(DbType), typeof(int), typeof(ParameterDirection), typeof(bool), typeof(byte), typeof(byte), typeof(string), typeof(DataRowVersion), typeof(object) };
parms = new object[] { parameter.ParameterName, (DbType)parameter._dbType, parameter.Direction, parameter.IsNullable, 0, 0, parameter.SourceColumn, parameter.SourceVersion, parameter.Value };
}
System.Reflection.ConstructorInfo info = typeof(SQLiteParameter).GetConstructor(types);
return new System.ComponentModel.Design.Serialization.InstanceDescriptor(info, parms);
}
}
#endif
}
}