1 /********************************************************
\r
2 * ADO.NET 2.0 Data Provider for SQLite Version 3.X
\r
3 * Written by Robert Simpson (robert@blackcastlesoft.com)
\r
5 * Released to the public domain, use at your own risk!
\r
6 ********************************************************/
\r
8 namespace Mono.Data.Sqlite
\r
12 using System.Data.Common;
\r
13 using System.ComponentModel;
\r
16 /// SQLite implementation of DbParameter.
\r
18 public sealed class SqliteParameter : DbParameter, ICloneable
\r
21 /// The data type of the parameter
\r
23 internal int _dbType;
\r
25 /// The version information for mapping the parameter
\r
27 private DataRowVersion _rowVersion;
\r
29 /// The value of the data in the parameter
\r
31 private Object _objValue;
\r
33 /// The source column for the parameter
\r
35 private string _sourceColumn;
\r
39 private string _parameterName;
\r
41 /// The data size, unused by SQLite
\r
43 private int _dataSize;
\r
45 private bool _nullable;
\r
46 private bool _nullMapping;
\r
49 /// Default constructor
\r
51 public SqliteParameter()
\r
52 : this(null, (DbType)(-1), 0, null, DataRowVersion.Current)
\r
57 /// Constructs a named parameter given the specified parameter name
\r
59 /// <param name="parameterName">The parameter name</param>
\r
60 public SqliteParameter(string parameterName)
\r
61 : this(parameterName, (DbType)(-1), 0, null, DataRowVersion.Current)
\r
66 /// Constructs a named parameter given the specified parameter name and initial value
\r
68 /// <param name="parameterName">The parameter name</param>
\r
69 /// <param name="value">The initial value of the parameter</param>
\r
70 public SqliteParameter(string parameterName, object value)
\r
71 : this(parameterName, (DbType)(-1), 0, null, DataRowVersion.Current)
\r
77 /// Constructs a named parameter of the specified type
\r
79 /// <param name="parameterName">The parameter name</param>
\r
80 /// <param name="dbType">The datatype of the parameter</param>
\r
81 public SqliteParameter(string parameterName, DbType dbType)
\r
82 : this(parameterName, dbType, 0, null, DataRowVersion.Current)
\r
87 /// Constructs a named parameter of the specified type and source column reference
\r
89 /// <param name="parameterName">The parameter name</param>
\r
90 /// <param name="dbType">The data type</param>
\r
91 /// <param name="sourceColumn">The source column</param>
\r
92 public SqliteParameter(string parameterName, DbType dbType, string sourceColumn)
\r
93 : this(parameterName, dbType, 0, sourceColumn, DataRowVersion.Current)
\r
98 /// Constructs a named parameter of the specified type, source column and row version
\r
100 /// <param name="parameterName">The parameter name</param>
\r
101 /// <param name="dbType">The data type</param>
\r
102 /// <param name="sourceColumn">The source column</param>
\r
103 /// <param name="rowVersion">The row version information</param>
\r
104 public SqliteParameter(string parameterName, DbType dbType, string sourceColumn, DataRowVersion rowVersion)
\r
105 : this(parameterName, dbType, 0, sourceColumn, rowVersion)
\r
110 /// Constructs an unnamed parameter of the specified data type
\r
112 /// <param name="dbType">The datatype of the parameter</param>
\r
113 public SqliteParameter(DbType dbType)
\r
114 : this(null, dbType, 0, null, DataRowVersion.Current)
\r
119 /// Constructs an unnamed parameter of the specified data type and sets the initial value
\r
121 /// <param name="dbType">The datatype of the parameter</param>
\r
122 /// <param name="value">The initial value of the parameter</param>
\r
123 public SqliteParameter(DbType dbType, object value)
\r
124 : this(null, dbType, 0, null, DataRowVersion.Current)
\r
130 /// Constructs an unnamed parameter of the specified data type and source column
\r
132 /// <param name="dbType">The datatype of the parameter</param>
\r
133 /// <param name="sourceColumn">The source column</param>
\r
134 public SqliteParameter(DbType dbType, string sourceColumn)
\r
135 : this(null, dbType, 0, sourceColumn, DataRowVersion.Current)
\r
140 /// Constructs an unnamed parameter of the specified data type, source column and row version
\r
142 /// <param name="dbType">The data type</param>
\r
143 /// <param name="sourceColumn">The source column</param>
\r
144 /// <param name="rowVersion">The row version information</param>
\r
145 public SqliteParameter(DbType dbType, string sourceColumn, DataRowVersion rowVersion)
\r
146 : this(null, dbType, 0, sourceColumn, rowVersion)
\r
151 /// Constructs a named parameter of the specified type and size
\r
153 /// <param name="parameterName">The parameter name</param>
\r
154 /// <param name="parameterType">The data type</param>
\r
155 /// <param name="parameterSize">The size of the parameter</param>
\r
156 public SqliteParameter(string parameterName, DbType parameterType, int parameterSize)
\r
157 : this(parameterName, parameterType, parameterSize, null, DataRowVersion.Current)
\r
162 /// Constructs a named parameter of the specified type, size and source column
\r
164 /// <param name="parameterName">The name of the parameter</param>
\r
165 /// <param name="parameterType">The data type</param>
\r
166 /// <param name="parameterSize">The size of the parameter</param>
\r
167 /// <param name="sourceColumn">The source column</param>
\r
168 public SqliteParameter(string parameterName, DbType parameterType, int parameterSize, string sourceColumn)
\r
169 : this(parameterName, parameterType, parameterSize, sourceColumn, DataRowVersion.Current)
\r
174 /// Constructs a named parameter of the specified type, size, source column and row version
\r
176 /// <param name="parameterName">The name of the parameter</param>
\r
177 /// <param name="parameterType">The data type</param>
\r
178 /// <param name="parameterSize">The size of the parameter</param>
\r
179 /// <param name="sourceColumn">The source column</param>
\r
180 /// <param name="rowVersion">The row version information</param>
\r
181 public SqliteParameter(string parameterName, DbType parameterType, int parameterSize, string sourceColumn, DataRowVersion rowVersion)
\r
183 _parameterName = parameterName;
\r
184 _dbType = (int)parameterType;
\r
185 _sourceColumn = sourceColumn;
\r
186 _rowVersion = rowVersion;
\r
188 _dataSize = parameterSize;
\r
189 _nullMapping = false;
\r
193 private SqliteParameter(SqliteParameter source)
\r
194 : this(source.ParameterName, (DbType)source._dbType, 0, source.Direction, source.IsNullable, 0, 0, source.SourceColumn, source.SourceVersion, source.Value)
\r
196 _nullMapping = source._nullMapping;
\r
200 /// Constructs a named parameter of the specified type, size, source column and row version
\r
202 /// <param name="parameterName">The name of the parameter</param>
\r
203 /// <param name="parameterType">The data type</param>
\r
204 /// <param name="parameterSize">The size of the parameter</param>
\r
205 /// <param name="direction">Only input parameters are supported in SQLite</param>
\r
206 /// <param name="isNullable">Ignored</param>
\r
207 /// <param name="precision">Ignored</param>
\r
208 /// <param name="scale">Ignored</param>
\r
209 /// <param name="sourceColumn">The source column</param>
\r
210 /// <param name="rowVersion">The row version information</param>
\r
211 /// <param name="value">The initial value to assign the parameter</param>
\r
212 #if !PLATFORM_COMPACTFRAMEWORK
\r
213 [EditorBrowsable(EditorBrowsableState.Advanced)]
\r
215 public SqliteParameter(string parameterName, DbType parameterType, int parameterSize, ParameterDirection direction, bool isNullable, byte precision, byte scale, string sourceColumn, DataRowVersion rowVersion, object value)
\r
216 : this(parameterName, parameterType, parameterSize, sourceColumn, rowVersion)
\r
218 Direction = direction;
\r
219 IsNullable = isNullable;
\r
224 /// Constructs a named parameter, yet another flavor
\r
226 /// <param name="parameterName">The name of the parameter</param>
\r
227 /// <param name="parameterType">The data type</param>
\r
228 /// <param name="parameterSize">The size of the parameter</param>
\r
229 /// <param name="direction">Only input parameters are supported in SQLite</param>
\r
230 /// <param name="precision">Ignored</param>
\r
231 /// <param name="scale">Ignored</param>
\r
232 /// <param name="sourceColumn">The source column</param>
\r
233 /// <param name="rowVersion">The row version information</param>
\r
234 /// <param name="sourceColumnNullMapping">Whether or not this parameter is for comparing NULL's</param>
\r
235 /// <param name="value">The intial value to assign the parameter</param>
\r
236 #if !PLATFORM_COMPACTFRAMEWORK
\r
237 [EditorBrowsable(EditorBrowsableState.Advanced)]
\r
239 public SqliteParameter(string parameterName, DbType parameterType, int parameterSize, ParameterDirection direction, byte precision, byte scale, string sourceColumn, DataRowVersion rowVersion, bool sourceColumnNullMapping, object value)
\r
240 : this(parameterName, parameterType, parameterSize, sourceColumn, rowVersion)
\r
242 Direction = direction;
\r
243 SourceColumnNullMapping = sourceColumnNullMapping;
\r
248 /// Constructs an unnamed parameter of the specified type and size
\r
250 /// <param name="parameterType">The data type</param>
\r
251 /// <param name="parameterSize">The size of the parameter</param>
\r
252 public SqliteParameter(DbType parameterType, int parameterSize)
\r
253 : this(null, parameterType, parameterSize, null, DataRowVersion.Current)
\r
258 /// Constructs an unnamed parameter of the specified type, size, and source column
\r
260 /// <param name="parameterType">The data type</param>
\r
261 /// <param name="parameterSize">The size of the parameter</param>
\r
262 /// <param name="sourceColumn">The source column</param>
\r
263 public SqliteParameter(DbType parameterType, int parameterSize, string sourceColumn)
\r
264 : this(null, parameterType, parameterSize, sourceColumn, DataRowVersion.Current)
\r
269 /// Constructs an unnamed parameter of the specified type, size, source column and row version
\r
271 /// <param name="parameterType">The data type</param>
\r
272 /// <param name="parameterSize">The size of the parameter</param>
\r
273 /// <param name="sourceColumn">The source column</param>
\r
274 /// <param name="rowVersion">The row version information</param>
\r
275 public SqliteParameter(DbType parameterType, int parameterSize, string sourceColumn, DataRowVersion rowVersion)
\r
276 : this(null, parameterType, parameterSize, sourceColumn, rowVersion)
\r
281 /// Whether or not the parameter can contain a null value
\r
283 public override bool IsNullable
\r
296 /// Returns the datatype of the parameter
\r
298 #if !PLATFORM_COMPACTFRAMEWORK
\r
299 [DbProviderSpecificTypeProperty(true)]
\r
300 [RefreshProperties(RefreshProperties.All)]
\r
302 public override DbType DbType
\r
308 if (_objValue != null && _objValue != DBNull.Value)
\r
310 return SqliteConvert.TypeToDbType(_objValue.GetType());
\r
312 return DbType.String; // Unassigned default value is String
\r
314 return (DbType)_dbType;
\r
318 _dbType = (int)value;
\r
323 /// Supports only input parameters
\r
325 public override ParameterDirection Direction
\r
329 return ParameterDirection.Input;
\r
333 if (value != ParameterDirection.Input)
\r
334 throw new NotSupportedException();
\r
339 /// Returns the parameter name
\r
341 public override string ParameterName
\r
345 return _parameterName;
\r
349 _parameterName = value;
\r
354 /// Resets the DbType of the parameter so it can be inferred from the value
\r
356 public override void ResetDbType()
\r
362 /// Returns the size of the parameter
\r
364 #if !PLATFORM_COMPACTFRAMEWORK
\r
365 [DefaultValue((int)0)]
\r
367 public override int Size
\r
380 /// Gets/sets the source column
\r
382 public override string SourceColumn
\r
386 return _sourceColumn;
\r
390 _sourceColumn = value;
\r
395 /// Used by DbCommandBuilder to determine the mapping for nullable fields
\r
397 public override bool SourceColumnNullMapping
\r
401 return _nullMapping;
\r
405 _nullMapping = value;
\r
410 /// Gets and sets the row version
\r
412 public override DataRowVersion SourceVersion
\r
416 return _rowVersion;
\r
420 _rowVersion = value;
\r
425 /// Gets and sets the parameter value. If no datatype was specified, the datatype will assume the type from the value given.
\r
427 #if !PLATFORM_COMPACTFRAMEWORK
\r
428 [TypeConverter(typeof(StringConverter)), RefreshProperties(RefreshProperties.All)]
\r
430 public override object Value
\r
439 if (_dbType == -1 && _objValue != null && _objValue != DBNull.Value) // If the DbType has never been assigned, try to glean one from the value's datatype
\r
440 _dbType = (int)SqliteConvert.TypeToDbType(_objValue.GetType());
\r
445 /// Clones a parameter
\r
447 /// <returns>A new, unassociated SqliteParameter</returns>
\r
448 public object Clone()
\r
450 SqliteParameter newparam = new SqliteParameter(this);
\r