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.Collections.Generic;
\r
14 using System.Globalization;
\r
15 using System.ComponentModel;
\r
16 using System.Reflection;
\r
19 /// SQLite implementation of DbParameterCollection.
\r
21 #if !PLATFORM_COMPACTFRAMEWORK
\r
22 [Editor("Microsoft.VSDesigner.Data.Design.DBParametersEditor, Microsoft.VSDesigner, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a", "System.Drawing.Design.UITypeEditor, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"), ListBindable(false)]
\r
24 public sealed class SqliteParameterCollection : DbParameterCollection
\r
27 /// The underlying command to which this collection belongs
\r
29 private SqliteCommand _command;
\r
31 /// The internal array of parameters in this collection
\r
33 private List<SqliteParameter> _parameterList;
\r
35 /// Determines whether or not all parameters have been bound to their statement(s)
\r
37 private bool _unboundFlag;
\r
40 /// Initializes the collection
\r
42 /// <param name="cmd">The command to which the collection belongs</param>
\r
43 internal SqliteParameterCollection(SqliteCommand cmd)
\r
46 _parameterList = new List<SqliteParameter>();
\r
47 _unboundFlag = true;
\r
53 public override bool IsSynchronized
\r
55 get { return true; }
\r
61 public override bool IsFixedSize
\r
63 get { return false; }
\r
69 public override bool IsReadOnly
\r
71 get { return false; }
\r
77 public override object SyncRoot
\r
79 get { return null; }
\r
83 /// Retrieves an enumerator for the collection
\r
85 /// <returns>An enumerator for the underlying array</returns>
\r
86 public override System.Collections.IEnumerator GetEnumerator()
\r
88 return _parameterList.GetEnumerator();
\r
92 /// Adds a parameter to the collection
\r
94 /// <param name="parameterName">The parameter name</param>
\r
95 /// <param name="parameterType">The data type</param>
\r
96 /// <param name="parameterSize">The size of the value</param>
\r
97 /// <param name="sourceColumn">The source column</param>
\r
98 /// <returns>A SqliteParameter object</returns>
\r
99 public SqliteParameter Add(string parameterName, DbType parameterType, int parameterSize, string sourceColumn)
\r
101 SqliteParameter param = new SqliteParameter(parameterName, parameterType, parameterSize, sourceColumn);
\r
108 /// Adds a parameter to the collection
\r
110 /// <param name="parameterName">The parameter name</param>
\r
111 /// <param name="parameterType">The data type</param>
\r
112 /// <param name="parameterSize">The size of the value</param>
\r
113 /// <returns>A SqliteParameter object</returns>
\r
114 public SqliteParameter Add(string parameterName, DbType parameterType, int parameterSize)
\r
116 SqliteParameter param = new SqliteParameter(parameterName, parameterType, parameterSize);
\r
123 /// Adds a parameter to the collection
\r
125 /// <param name="parameterName">The parameter name</param>
\r
126 /// <param name="parameterType">The data type</param>
\r
127 /// <returns>A SqliteParameter object</returns>
\r
128 public SqliteParameter Add(string parameterName, DbType parameterType)
\r
130 SqliteParameter param = new SqliteParameter(parameterName, parameterType);
\r
137 /// Adds a parameter to the collection
\r
139 /// <param name="parameter">The parameter to add</param>
\r
140 /// <returns>A zero-based index of where the parameter is located in the array</returns>
\r
141 public int Add(SqliteParameter parameter)
\r
145 if (String.IsNullOrEmpty(parameter.ParameterName) == false)
\r
147 n = IndexOf(parameter.ParameterName);
\r
152 n = _parameterList.Count;
\r
153 _parameterList.Add((SqliteParameter)parameter);
\r
156 SetParameter(n, parameter);
\r
162 /// Adds a parameter to the collection
\r
164 /// <param name="value">The parameter to add</param>
\r
165 /// <returns>A zero-based index of where the parameter is located in the array</returns>
\r
166 #if !PLATFORM_COMPACTFRAMEWORK
\r
167 [EditorBrowsable(EditorBrowsableState.Never)]
\r
169 public override int Add(object value)
\r
171 return Add((SqliteParameter)value);
\r
175 /// Adds a named/unnamed parameter and its value to the parameter collection.
\r
177 /// <param name="parameterName">Name of the parameter, or null to indicate an unnamed parameter</param>
\r
178 /// <param name="value">The initial value of the parameter</param>
\r
179 /// <returns>Returns the SqliteParameter object created during the call.</returns>
\r
180 public SqliteParameter AddWithValue(string parameterName, object value)
\r
182 SqliteParameter param = new SqliteParameter(parameterName, value);
\r
189 /// Adds an array of parameters to the collection
\r
191 /// <param name="values">The array of parameters to add</param>
\r
192 public void AddRange(SqliteParameter[] values)
\r
194 int x = values.Length;
\r
195 for (int n = 0; n < x; n++)
\r
200 /// Adds an array of parameters to the collection
\r
202 /// <param name="values">The array of parameters to add</param>
\r
203 public override void AddRange(Array values)
\r
205 int x = values.Length;
\r
206 for (int n = 0; n < x; n++)
\r
207 Add((SqliteParameter)(values.GetValue(n)));
\r
211 /// Clears the array and resets the collection
\r
213 public override void Clear()
\r
215 _unboundFlag = true;
\r
216 _parameterList.Clear();
\r
220 /// Determines if the named parameter exists in the collection
\r
222 /// <param name="parameterName">The name of the parameter to check</param>
\r
223 /// <returns>True if the parameter is in the collection</returns>
\r
224 public override bool Contains(string parameterName)
\r
226 return (IndexOf(parameterName) != -1);
\r
230 /// Determines if the parameter exists in the collection
\r
232 /// <param name="value">The SqliteParameter to check</param>
\r
233 /// <returns>True if the parameter is in the collection</returns>
\r
234 public override bool Contains(object value)
\r
236 return _parameterList.Contains((SqliteParameter)value);
\r
240 /// Not implemented
\r
242 /// <param name="array"></param>
\r
243 /// <param name="index"></param>
\r
244 public override void CopyTo(Array array, int index)
\r
246 throw new NotImplementedException();
\r
250 /// Returns a count of parameters in the collection
\r
252 public override int Count
\r
254 get { return _parameterList.Count; }
\r
258 /// Overloaded to specialize the return value of the default indexer
\r
260 /// <param name="parameterName">Name of the parameter to get/set</param>
\r
261 /// <returns>The specified named SQLite parameter</returns>
\r
262 public new SqliteParameter this[string parameterName]
\r
266 return (SqliteParameter)GetParameter(parameterName);
\r
270 SetParameter(parameterName, value);
\r
275 /// Overloaded to specialize the return value of the default indexer
\r
277 /// <param name="index">The index of the parameter to get/set</param>
\r
278 /// <returns>The specified SQLite parameter</returns>
\r
279 public new SqliteParameter this[int index]
\r
283 return (SqliteParameter)GetParameter(index);
\r
287 SetParameter(index, value);
\r
291 /// Retrieve a parameter by name from the collection
\r
293 /// <param name="parameterName">The name of the parameter to fetch</param>
\r
294 /// <returns>A DbParameter object</returns>
\r
295 protected override DbParameter GetParameter(string parameterName)
\r
297 return GetParameter(IndexOf(parameterName));
\r
301 /// Retrieves a parameter by its index in the collection
\r
303 /// <param name="index">The index of the parameter to retrieve</param>
\r
304 /// <returns>A DbParameter object</returns>
\r
305 protected override DbParameter GetParameter(int index)
\r
307 return _parameterList[index];
\r
311 /// Returns the index of a parameter given its name
\r
313 /// <param name="parameterName">The name of the parameter to find</param>
\r
314 /// <returns>-1 if not found, otherwise a zero-based index of the parameter</returns>
\r
315 public override int IndexOf(string parameterName)
\r
317 int x = _parameterList.Count;
\r
318 for (int n = 0; n < x; n++)
\r
320 if (String.Compare(parameterName, _parameterList[n].ParameterName, true, CultureInfo.InvariantCulture) == 0)
\r
327 /// Returns the index of a parameter
\r
329 /// <param name="value">The parameter to find</param>
\r
330 /// <returns>-1 if not found, otherwise a zero-based index of the parameter</returns>
\r
331 public override int IndexOf(object value)
\r
333 return _parameterList.IndexOf((SqliteParameter)value);
\r
337 /// Inserts a parameter into the array at the specified location
\r
339 /// <param name="index">The zero-based index to insert the parameter at</param>
\r
340 /// <param name="value">The parameter to insert</param>
\r
341 public override void Insert(int index, object value)
\r
343 _unboundFlag = true;
\r
344 _parameterList.Insert(index, (SqliteParameter)value);
\r
348 /// Removes a parameter from the collection
\r
350 /// <param name="value">The parameter to remove</param>
\r
351 public override void Remove(object value)
\r
353 _unboundFlag = true;
\r
354 _parameterList.Remove((SqliteParameter)value);
\r
358 /// Removes a parameter from the collection given its name
\r
360 /// <param name="parameterName">The name of the parameter to remove</param>
\r
361 public override void RemoveAt(string parameterName)
\r
363 RemoveAt(IndexOf(parameterName));
\r
367 /// Removes a parameter from the collection given its index
\r
369 /// <param name="index">The zero-based parameter index to remove</param>
\r
370 public override void RemoveAt(int index)
\r
372 _unboundFlag = true;
\r
373 _parameterList.RemoveAt(index);
\r
377 /// Re-assign the named parameter to a new parameter object
\r
379 /// <param name="parameterName">The name of the parameter to replace</param>
\r
380 /// <param name="value">The new parameter</param>
\r
381 protected override void SetParameter(string parameterName, DbParameter value)
\r
383 SetParameter(IndexOf(parameterName), value);
\r
387 /// Re-assign a parameter at the specified index
\r
389 /// <param name="index">The zero-based index of the parameter to replace</param>
\r
390 /// <param name="value">The new parameter</param>
\r
391 protected override void SetParameter(int index, DbParameter value)
\r
393 _unboundFlag = true;
\r
394 _parameterList[index] = (SqliteParameter)value;
\r
398 /// Un-binds all parameters from their statements
\r
400 internal void Unbind()
\r
402 _unboundFlag = true;
\r
406 /// This function attempts to map all parameters in the collection to all statements in a Command.
\r
407 /// Since named parameters may span multiple statements, this function makes sure all statements are bound
\r
408 /// to the same named parameter. Unnamed parameters are bound in sequence.
\r
410 internal void MapParameters(SqliteStatement activeStatement)
\r
412 if (_unboundFlag == false || _parameterList.Count == 0 || _command._statementList == null) return;
\r
418 SqliteStatement stmt;
\r
420 foreach(SqliteParameter p in _parameterList)
\r
423 s = p.ParameterName;
\r
426 s = String.Format(CultureInfo.InvariantCulture, ";{0}", nUnnamed);
\r
431 bool isMapped = false;
\r
433 if (activeStatement == null)
\r
434 x = _command._statementList.Count;
\r
438 stmt = activeStatement;
\r
439 for (n = 0; n < x; n++)
\r
442 if (stmt == null) stmt = _command._statementList[n];
\r
443 if (stmt._paramNames != null)
\r
445 if (stmt.MapParameter(s, p) == true)
\r
451 // If the parameter has a name, but the SQL statement uses unnamed references, this can happen -- attempt to map
\r
452 // the parameter by its index in the collection
\r
453 if (isMapped == false)
\r
455 s = String.Format(CultureInfo.InvariantCulture, ";{0}", y);
\r
457 stmt = activeStatement;
\r
458 for (n = 0; n < x; n++)
\r
460 if (stmt == null) stmt = _command._statementList[n];
\r
461 if (stmt._paramNames != null)
\r
463 if (stmt.MapParameter(s, p) == true)
\r
470 if (activeStatement == null) _unboundFlag = false;
\r