[jit] Fix the saving of the 'cfg->ret_var_set' flag when inlining, it was set to...
[mono.git] / mcs / class / Mono.Data.Sqlite / Mono.Data.Sqlite_2.0 / SQLiteParameterCollection.cs
index 675555f2c6b31b73fe5dc28500b9bdd7eb77617f..daf0e6afb972175eb000f03689ca0f0778d41a90 100644 (file)
-//
-// Mono.Data.Sqlite.SQLiteParameterCollection.cs
-//
-// Author(s):
-//   Robert Simpson (robert@blackcastlesoft.com)
-//
-// Adapted and modified for the Mono Project by
-//   Marek Habersack (grendello@gmail.com)
-//
-//
-// Copyright (C) 2006 Novell, Inc (http://www.novell.com)
-// Copyright (C) 2007 Marek Habersack
-//
-// Permission is hereby granted, free of charge, to any person obtaining
-// a copy of this software and associated documentation files (the
-// "Software"), to deal in the Software without restriction, including
-// without limitation the rights to use, copy, modify, merge, publish,
-// distribute, sublicense, and/or sell copies of the Software, and to
-// permit persons to whom the Software is furnished to do so, subject to
-// the following conditions:
-// 
-// The above copyright notice and this permission notice shall be
-// included in all copies or substantial portions of the Software.
-// 
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-//
-
-/********************************************************
- * 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!
- ********************************************************/
-#if NET_2_0
-namespace Mono.Data.Sqlite
-{
-  using System;
-  using System.Data;
-  using System.Data.Common;
-  using System.Collections.Generic;
-  using System.Globalization;
-  using System.ComponentModel;
-  using System.Reflection;
-
-  /// <summary>
-  /// Sqlite implementation of DbParameterCollection.
-  /// </summary>
-#if !PLATFORM_COMPACTFRAMEWORK
-  [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)]
-#endif
-  public class SqliteParameterCollection : DbParameterCollection
-  {
-    /// <summary>
-    /// The underlying command to which this collection belongs
-    /// </summary>
-    private SqliteCommand         _command;
-    /// <summary>
-    /// The internal array of parameters in this collection
-    /// </summary>
-    private List<SqliteParameter> _parameterList;
-    /// <summary>
-    /// Determines whether or not all parameters have been bound to their statement(s)
-    /// </summary>
-    private bool                  _unboundFlag;
-
-    /// <summary>
-    /// Initializes the collection
-    /// </summary>
-    /// <param name="cmd">The command to which the collection belongs</param>
-    internal SqliteParameterCollection(SqliteCommand cmd)
-    {
-      _command = cmd;
-      _parameterList = new List<SqliteParameter>();
-      _unboundFlag = true;
-    }
-
-    /// <summary>
-    /// Returns true
-    /// </summary>
-    public override bool IsSynchronized
-    {
-      get { return true; }
-    }
-
-    /// <summary>
-    /// Returns false
-    /// </summary>
-    public override bool IsFixedSize
-    {
-      get { return false; }
-    }
-
-    /// <summary>
-    /// Returns false
-    /// </summary>
-    public override bool IsReadOnly
-    {
-      get { return false; }
-    }
-
-    /// <summary>
-    /// Returns null
-    /// </summary>
-    public override object SyncRoot
-    {
-      get { return null; }
-    }
-
-    /// <summary>
-    /// Retrieves an enumerator for the collection
-    /// </summary>
-    /// <returns>An enumerator for the underlying array</returns>
-    public override System.Collections.IEnumerator GetEnumerator()
-    {
-      return _parameterList.GetEnumerator();
-    }
-
-    /// <summary>
-    /// Adds a parameter to the collection
-    /// </summary>
-    /// <param name="parameterName">The parameter name</param>
-    /// <param name="parameterType">The data type</param>
-    /// <param name="parameterSize">The size of the value</param>
-    /// <param name="sourceColumn">The source column</param>
-    /// <returns>A SqliteParameter object</returns>
-    public SqliteParameter Add(string parameterName, DbType parameterType, int parameterSize, string sourceColumn)
-    {
-      SqliteParameter param = new SqliteParameter(parameterName, parameterType, parameterSize, sourceColumn);
-      Add(param);
-
-      return param;
-    }
-
-    /// <summary>
-    /// Adds a parameter to the collection
-    /// </summary>
-    /// <param name="parameterName">The parameter name</param>
-    /// <param name="parameterType">The data type</param>
-    /// <param name="parameterSize">The size of the value</param>
-    /// <returns>A SqliteParameter object</returns>
-    public SqliteParameter Add(string parameterName, DbType parameterType, int parameterSize)
-    {
-      SqliteParameter param = new SqliteParameter(parameterName, parameterType, parameterSize);
-      Add(param);
-
-      return param;
-    }
-
-    /// <summary>
-    /// Adds a parameter to the collection
-    /// </summary>
-    /// <param name="parameterName">The parameter name</param>
-    /// <param name="parameterType">The data type</param>
-    /// <returns>A SqliteParameter object</returns>
-    public SqliteParameter Add(string parameterName, DbType parameterType)
-    {
-      SqliteParameter param = new SqliteParameter(parameterName, parameterType);
-      Add(param);
-
-      return param;
-    }
-
-    /// <summary>
-    /// Adds a parameter to the collection
-    /// </summary>
-    /// <param name="parameter">The parameter to add</param>
-    /// <returns>A zero-based index of where the parameter is located in the array</returns>
-    public int Add(SqliteParameter parameter)
-    {
-      int n = -1;
-
-      if (parameter.ParameterName != null)
-      {
-        n = IndexOf(parameter.ParameterName);
-      }
-
-      if (n == -1)
-      {
-        n = _parameterList.Count;
-        _parameterList.Add((SqliteParameter)parameter);
-      }
-
-      SetParameter(n, parameter);
-
-      return n;
-    }
-
-    /// <summary>
-    /// Adds a parameter to the collection
-    /// </summary>
-    /// <param name="value">The parameter to add</param>
-    /// <returns>A zero-based index of where the parameter is located in the array</returns>
-#if !PLATFORM_COMPACTFRAMEWORK
-    [EditorBrowsable(EditorBrowsableState.Never)]
-#endif
-    public override int Add(object value)
-    {
-      return Add((SqliteParameter)value);
-    }
-
-    /// <summary>
-    /// Adds a named/unnamed parameter and its value to the parameter collection.
-    /// </summary>
-    /// <param name="parameterName">Name of the parameter, or null to indicate an unnamed parameter</param>
-    /// <param name="value">The initial value of the parameter</param>
-    /// <returns>Returns the SqliteParameter object created during the call.</returns>
-    public SqliteParameter AddWithValue(string parameterName, object value)
-    {
-      SqliteParameter param = new SqliteParameter(parameterName, value);
-      Add(param);
-
-      return param;
-    }
-
-    /// <summary>
-    /// Adds an array of parameters to the collection
-    /// </summary>
-    /// <param name="values">The array of parameters to add</param>
-    public void AddRange(SqliteParameter[] values)
-    {
-      int x = values.Length;
-      for (int n = 0; n < x; n++)
-        Add(values[n]);
-    }
-
-    /// <summary>
-    /// Adds an array of parameters to the collection
-    /// </summary>
-    /// <param name="values">The array of parameters to add</param>
-    public override void AddRange(Array values)
-    {
-      int x = values.Length;
-      for (int n = 0; n < x; n++)
-        Add((SqliteParameter)(values.GetValue(n)));
-    }
-
-    /// <summary>
-    /// Clears the array and resets the collection
-    /// </summary>
-    public override void Clear()
-    {
-      _unboundFlag = true;
-      _parameterList.Clear();
-    }
-
-    /// <summary>
-    /// Determines if the named parameter exists in the collection
-    /// </summary>
-    /// <param name="parameterName">The name of the parameter to check</param>
-    /// <returns>True if the parameter is in the collection</returns>
-    public override bool Contains(string parameterName)
-    {
-      return (IndexOf(parameterName) != -1);
-    }
-
-    /// <summary>
-    /// Determines if the parameter exists in the collection
-    /// </summary>
-    /// <param name="value">The SqliteParameter to check</param>
-    /// <returns>True if the parameter is in the collection</returns>
-    public override bool Contains(object value)
-    {
-      return _parameterList.Contains((SqliteParameter)value);
-    }
-
-    /// <summary>
-    /// Not implemented
-    /// </summary>
-    /// <param name="array"></param>
-    /// <param name="index"></param>
-    public override void CopyTo(Array array, int index)
-    {
-      throw new NotImplementedException();
-    }
-
-    /// <summary>
-    /// Returns a count of parameters in the collection
-    /// </summary>
-    public override int Count
-    {
-      get { return _parameterList.Count; }
-    }
-
-    /// <summary>
-    /// Overloaded to specialize the return value of the default indexer
-    /// </summary>
-    /// <param name="parameterName">Name of the parameter to get/set</param>
-    /// <returns>The specified named Sqlite parameter</returns>
-    public new SqliteParameter this[string parameterName]
-    {
-      get
-      {
-        return (SqliteParameter)GetParameter(parameterName);
-      }
-      set
-      {
-        SetParameter(parameterName, value);
-      }
-    }
-
-    /// <summary>
-    /// Overloaded to specialize the return value of the default indexer
-    /// </summary>
-    /// <param name="index">The index of the parameter to get/set</param>
-    /// <returns>The specified Sqlite parameter</returns>
-    public new SqliteParameter this[int index]
-    {
-      get
-      {
-        return (SqliteParameter)GetParameter(index);
-      }
-      set
-      {
-        SetParameter(index, value);
-      }
-    }
-    /// <summary>
-    /// Retrieve a parameter by name from the collection
-    /// </summary>
-    /// <param name="parameterName">The name of the parameter to fetch</param>
-    /// <returns>A DbParameter object</returns>
-    protected override DbParameter GetParameter(string parameterName)
-    {
-      return GetParameter(IndexOf(parameterName));
-    }
-
-    /// <summary>
-    /// Retrieves a parameter by its index in the collection
-    /// </summary>
-    /// <param name="index">The index of the parameter to retrieve</param>
-    /// <returns>A DbParameter object</returns>
-    protected override DbParameter GetParameter(int index)
-    {
-      return _parameterList[index];
-    }
-
-    /// <summary>
-    /// Returns the index of a parameter given its name
-    /// </summary>
-    /// <param name="parameterName">The name of the parameter to find</param>
-    /// <returns>-1 if not found, otherwise a zero-based index of the parameter</returns>
-    public override int IndexOf(string parameterName)
-    {
-      int x = _parameterList.Count;
-      for (int n = 0; n < x; n++)
-      {
-        if (String.Compare(parameterName, _parameterList[n].ParameterName, true, CultureInfo.InvariantCulture) == 0)
-          return n;
-      }
-      return -1;
-    }
-
-    /// <summary>
-    /// Returns the index of a parameter
-    /// </summary>
-    /// <param name="value">The parameter to find</param>
-    /// <returns>-1 if not found, otherwise a zero-based index of the parameter</returns>
-    public override int IndexOf(object value)
-    {
-      return _parameterList.IndexOf((SqliteParameter)value);
-    }
-
-    /// <summary>
-    /// Inserts a parameter into the array at the specified location
-    /// </summary>
-    /// <param name="index">The zero-based index to insert the parameter at</param>
-    /// <param name="value">The parameter to insert</param>
-    public override void Insert(int index, object value)
-    {
-      _unboundFlag = true;
-      _parameterList.Insert(index, (SqliteParameter)value);
-    }
-
-    /// <summary>
-    /// Removes a parameter from the collection
-    /// </summary>
-    /// <param name="value">The parameter to remove</param>
-    public override void Remove(object value)
-    {
-      _unboundFlag = true;
-      _parameterList.Remove((SqliteParameter)value);
-    }
-
-    /// <summary>
-    /// Removes a parameter from the collection given its name
-    /// </summary>
-    /// <param name="parameterName">The name of the parameter to remove</param>
-    public override void RemoveAt(string parameterName)
-    {
-      RemoveAt(IndexOf(parameterName));
-    }
-
-    /// <summary>
-    /// Removes a parameter from the collection given its index
-    /// </summary>
-    /// <param name="index">The zero-based parameter index to remove</param>
-    public override void RemoveAt(int index)
-    {
-      _unboundFlag = true;
-      _parameterList.RemoveAt(index);
-    }
-
-    /// <summary>
-    /// Re-assign the named parameter to a new parameter object
-    /// </summary>
-    /// <param name="parameterName">The name of the parameter to replace</param>
-    /// <param name="value">The new parameter</param>
-    protected override void SetParameter(string parameterName, DbParameter value)
-    {
-      SetParameter(IndexOf(parameterName), value);
-    }
-
-    /// <summary>
-    /// Re-assign a parameter at the specified index
-    /// </summary>
-    /// <param name="index">The zero-based index of the parameter to replace</param>
-    /// <param name="value">The new parameter</param>
-    protected override void SetParameter(int index, DbParameter value)
-    {
-      _unboundFlag = true;
-      _parameterList[index] = (SqliteParameter)value;
-    }
-
-    /// <summary>
-    /// Un-binds all parameters from their statements
-    /// </summary>
-    internal void Unbind()
-    {
-      _unboundFlag = true;
-    }
-
-    /// <summary>
-    /// This function attempts to map all parameters in the collection to all statements in a Command.
-    /// Since named parameters may span multiple statements, this function makes sure all statements are bound
-    /// to the same named parameter.  Unnamed parameters are bound in sequence.
-    /// </summary>
-    internal void MapParameters(SqliteStatement activeStatement)
-    {
-      if (_unboundFlag == false || _parameterList.Count == 0 || _command._statementList == null) return;
-
-      int nUnnamed = 0;
-      string s;
-      int n;
-      int y = -1;
-      SqliteStatement stmt;
-
-      foreach(SqliteParameter p in _parameterList)
-      {
-        y ++;
-        s = p.ParameterName;
-        if (s == null)
-        {
-          s = String.Format(CultureInfo.InvariantCulture, ";{0}", nUnnamed);
-          nUnnamed++;
-        }
-
-        int x;
-        bool isMapped = false;
-
-        if (activeStatement == null)
-          x = _command._statementList.Count;
-        else
-          x = 1;
-
-        stmt = activeStatement;
-        for (n = 0; n < x; n++)
-        {
-          isMapped = false;
-          if (stmt == null) stmt = _command._statementList[n];
-          if (stmt._paramNames != null)
-          {
-            if (stmt.MapParameter(s, p) == true)
-              isMapped = true;
-          }
-          stmt = null;
-        }
-
-        // If the parameter has a name, but the SQL statement uses unnamed references, this can happen -- attempt to map
-        // the parameter by its index in the collection
-        if (isMapped == false)
-        {
-          s = String.Format(CultureInfo.InvariantCulture, ";{0}", y);
-
-          stmt = activeStatement;
-          for (n = 0; n < x; n++)
-          {
-            if (stmt == null) stmt = _command._statementList[n];
-            if (stmt._paramNames != null)
-            {
-              if (stmt.MapParameter(s, p) == true)
-                isMapped = true;
-            }
-            stmt = null;
-          }
-        }
-      }
-      if (activeStatement == null) _unboundFlag = false;
-    }
-  }
-}
-#endif
+/********************************************************\r
+ * ADO.NET 2.0 Data Provider for SQLite Version 3.X\r
+ * Written by Robert Simpson (robert@blackcastlesoft.com)\r
+ * \r
+ * Released to the public domain, use at your own risk!\r
+ ********************************************************/\r
+\r
+namespace Mono.Data.Sqlite\r
+{\r
+  using System;\r
+  using System.Data;\r
+  using System.Data.Common;\r
+  using System.Collections.Generic;\r
+  using System.Globalization;\r
+  using System.ComponentModel;\r
+  using System.Reflection;\r
+\r
+  /// <summary>\r
+  /// SQLite implementation of DbParameterCollection.\r
+  /// </summary>\r
+#if !PLATFORM_COMPACTFRAMEWORK\r
+  [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
+#endif\r
+  public sealed class SqliteParameterCollection : DbParameterCollection\r
+  {\r
+    /// <summary>\r
+    /// The underlying command to which this collection belongs\r
+    /// </summary>\r
+    private SqliteCommand         _command;\r
+    /// <summary>\r
+    /// The internal array of parameters in this collection\r
+    /// </summary>\r
+    private List<SqliteParameter> _parameterList;\r
+    /// <summary>\r
+    /// Determines whether or not all parameters have been bound to their statement(s)\r
+    /// </summary>\r
+    private bool                  _unboundFlag;\r
+\r
+    /// <summary>\r
+    /// Initializes the collection\r
+    /// </summary>\r
+    /// <param name="cmd">The command to which the collection belongs</param>\r
+    internal SqliteParameterCollection(SqliteCommand cmd)\r
+    {\r
+      _command = cmd;\r
+      _parameterList = new List<SqliteParameter>();\r
+      _unboundFlag = true;\r
+    }\r
+\r
+    /// <summary>\r
+    /// Returns true\r
+    /// </summary>\r
+    public override bool IsSynchronized\r
+    {\r
+      get { return true; }\r
+    }\r
+\r
+    /// <summary>\r
+    /// Returns false\r
+    /// </summary>\r
+    public override bool IsFixedSize\r
+    {\r
+      get { return false; }\r
+    }\r
+\r
+    /// <summary>\r
+    /// Returns false\r
+    /// </summary>\r
+    public override bool IsReadOnly\r
+    {\r
+      get { return false; }\r
+    }\r
+\r
+    /// <summary>\r
+    /// Returns null\r
+    /// </summary>\r
+    public override object SyncRoot\r
+    {\r
+      get { return null; }\r
+    }\r
+\r
+    /// <summary>\r
+    /// Retrieves an enumerator for the collection\r
+    /// </summary>\r
+    /// <returns>An enumerator for the underlying array</returns>\r
+    public override System.Collections.IEnumerator GetEnumerator()\r
+    {\r
+      return _parameterList.GetEnumerator();\r
+    }\r
+\r
+    /// <summary>\r
+    /// Adds a parameter to the collection\r
+    /// </summary>\r
+    /// <param name="parameterName">The parameter name</param>\r
+    /// <param name="parameterType">The data type</param>\r
+    /// <param name="parameterSize">The size of the value</param>\r
+    /// <param name="sourceColumn">The source column</param>\r
+    /// <returns>A SqliteParameter object</returns>\r
+    public SqliteParameter Add(string parameterName, DbType parameterType, int parameterSize, string sourceColumn)\r
+    {\r
+      SqliteParameter param = new SqliteParameter(parameterName, parameterType, parameterSize, sourceColumn);\r
+      Add(param);\r
+\r
+      return param;\r
+    }\r
+\r
+    /// <summary>\r
+    /// Adds a parameter to the collection\r
+    /// </summary>\r
+    /// <param name="parameterName">The parameter name</param>\r
+    /// <param name="parameterType">The data type</param>\r
+    /// <param name="parameterSize">The size of the value</param>\r
+    /// <returns>A SqliteParameter object</returns>\r
+    public SqliteParameter Add(string parameterName, DbType parameterType, int parameterSize)\r
+    {\r
+      SqliteParameter param = new SqliteParameter(parameterName, parameterType, parameterSize);\r
+      Add(param);\r
+\r
+      return param;\r
+    }\r
+\r
+    /// <summary>\r
+    /// Adds a parameter to the collection\r
+    /// </summary>\r
+    /// <param name="parameterName">The parameter name</param>\r
+    /// <param name="parameterType">The data type</param>\r
+    /// <returns>A SqliteParameter object</returns>\r
+    public SqliteParameter Add(string parameterName, DbType parameterType)\r
+    {\r
+      SqliteParameter param = new SqliteParameter(parameterName, parameterType);\r
+      Add(param);\r
+\r
+      return param;\r
+    }\r
+\r
+    /// <summary>\r
+    /// Adds a parameter to the collection\r
+    /// </summary>\r
+    /// <param name="parameter">The parameter to add</param>\r
+    /// <returns>A zero-based index of where the parameter is located in the array</returns>\r
+    public int Add(SqliteParameter parameter)\r
+    {\r
+      int n = -1;\r
+\r
+      if (String.IsNullOrEmpty(parameter.ParameterName) == false)\r
+      {\r
+        n = IndexOf(parameter.ParameterName);\r
+      }\r
+\r
+      if (n == -1)\r
+      {\r
+        n = _parameterList.Count;\r
+        _parameterList.Add((SqliteParameter)parameter);\r
+      }\r
+\r
+      SetParameter(n, parameter);\r
+\r
+      return n;\r
+    }\r
+\r
+    /// <summary>\r
+    /// Adds a parameter to the collection\r
+    /// </summary>\r
+    /// <param name="value">The parameter to add</param>\r
+    /// <returns>A zero-based index of where the parameter is located in the array</returns>\r
+#if !PLATFORM_COMPACTFRAMEWORK\r
+    [EditorBrowsable(EditorBrowsableState.Never)]\r
+#endif\r
+    public override int Add(object value)\r
+    {\r
+      return Add((SqliteParameter)value);\r
+    }\r
+\r
+    /// <summary>\r
+    /// Adds a named/unnamed parameter and its value to the parameter collection.\r
+    /// </summary>\r
+    /// <param name="parameterName">Name of the parameter, or null to indicate an unnamed parameter</param>\r
+    /// <param name="value">The initial value of the parameter</param>\r
+    /// <returns>Returns the SqliteParameter object created during the call.</returns>\r
+    public SqliteParameter AddWithValue(string parameterName, object value)\r
+    {\r
+      SqliteParameter param = new SqliteParameter(parameterName, value);\r
+      Add(param);\r
+\r
+      return param;\r
+    }\r
+\r
+    /// <summary>\r
+    /// Adds an array of parameters to the collection\r
+    /// </summary>\r
+    /// <param name="values">The array of parameters to add</param>\r
+    public void AddRange(SqliteParameter[] values)\r
+    {\r
+      int x = values.Length;\r
+      for (int n = 0; n < x; n++)\r
+        Add(values[n]);\r
+    }\r
+\r
+    /// <summary>\r
+    /// Adds an array of parameters to the collection\r
+    /// </summary>\r
+    /// <param name="values">The array of parameters to add</param>\r
+    public override void AddRange(Array values)\r
+    {\r
+      int x = values.Length;\r
+      for (int n = 0; n < x; n++)\r
+        Add((SqliteParameter)(values.GetValue(n)));\r
+    }\r
+\r
+    /// <summary>\r
+    /// Clears the array and resets the collection\r
+    /// </summary>\r
+    public override void Clear()\r
+    {\r
+      _unboundFlag = true;\r
+      _parameterList.Clear();\r
+    }\r
+\r
+    /// <summary>\r
+    /// Determines if the named parameter exists in the collection\r
+    /// </summary>\r
+    /// <param name="parameterName">The name of the parameter to check</param>\r
+    /// <returns>True if the parameter is in the collection</returns>\r
+    public override bool Contains(string parameterName)\r
+    {\r
+      return (IndexOf(parameterName) != -1);\r
+    }\r
+\r
+    /// <summary>\r
+    /// Determines if the parameter exists in the collection\r
+    /// </summary>\r
+    /// <param name="value">The SqliteParameter to check</param>\r
+    /// <returns>True if the parameter is in the collection</returns>\r
+    public override bool Contains(object value)\r
+    {\r
+      return _parameterList.Contains((SqliteParameter)value);\r
+    }\r
+\r
+    /// <summary>\r
+    /// Not implemented\r
+    /// </summary>\r
+    /// <param name="array"></param>\r
+    /// <param name="index"></param>\r
+    public override void CopyTo(Array array, int index)\r
+    {\r
+      throw new NotImplementedException();\r
+    }\r
+\r
+    /// <summary>\r
+    /// Returns a count of parameters in the collection\r
+    /// </summary>\r
+    public override int Count\r
+    {\r
+      get { return _parameterList.Count; }\r
+    }\r
+\r
+    /// <summary>\r
+    /// Overloaded to specialize the return value of the default indexer\r
+    /// </summary>\r
+    /// <param name="parameterName">Name of the parameter to get/set</param>\r
+    /// <returns>The specified named SQLite parameter</returns>\r
+    public new SqliteParameter this[string parameterName]\r
+    {\r
+      get\r
+      {\r
+        return (SqliteParameter)GetParameter(parameterName);\r
+      }\r
+      set\r
+      {\r
+        SetParameter(parameterName, value);\r
+      }\r
+    }\r
+\r
+    /// <summary>\r
+    /// Overloaded to specialize the return value of the default indexer\r
+    /// </summary>\r
+    /// <param name="index">The index of the parameter to get/set</param>\r
+    /// <returns>The specified SQLite parameter</returns>\r
+    public new SqliteParameter this[int index]\r
+    {\r
+      get\r
+      {\r
+        return (SqliteParameter)GetParameter(index);\r
+      }\r
+      set\r
+      {\r
+        SetParameter(index, value);\r
+      }\r
+    }\r
+    /// <summary>\r
+    /// Retrieve a parameter by name from the collection\r
+    /// </summary>\r
+    /// <param name="parameterName">The name of the parameter to fetch</param>\r
+    /// <returns>A DbParameter object</returns>\r
+    protected override DbParameter GetParameter(string parameterName)\r
+    {\r
+      return GetParameter(IndexOf(parameterName));\r
+    }\r
+\r
+    /// <summary>\r
+    /// Retrieves a parameter by its index in the collection\r
+    /// </summary>\r
+    /// <param name="index">The index of the parameter to retrieve</param>\r
+    /// <returns>A DbParameter object</returns>\r
+    protected override DbParameter GetParameter(int index)\r
+    {\r
+      return _parameterList[index];\r
+    }\r
+\r
+    /// <summary>\r
+    /// Returns the index of a parameter given its name\r
+    /// </summary>\r
+    /// <param name="parameterName">The name of the parameter to find</param>\r
+    /// <returns>-1 if not found, otherwise a zero-based index of the parameter</returns>\r
+    public override int IndexOf(string parameterName)\r
+    {\r
+      int x = _parameterList.Count;\r
+      for (int n = 0; n < x; n++)\r
+      {\r
+        if (String.Compare(parameterName, _parameterList[n].ParameterName, true, CultureInfo.InvariantCulture) == 0)\r
+          return n;\r
+      }\r
+      return -1;\r
+    }\r
+\r
+    /// <summary>\r
+    /// Returns the index of a parameter\r
+    /// </summary>\r
+    /// <param name="value">The parameter to find</param>\r
+    /// <returns>-1 if not found, otherwise a zero-based index of the parameter</returns>\r
+    public override int IndexOf(object value)\r
+    {\r
+      return _parameterList.IndexOf((SqliteParameter)value);\r
+    }\r
+\r
+    /// <summary>\r
+    /// Inserts a parameter into the array at the specified location\r
+    /// </summary>\r
+    /// <param name="index">The zero-based index to insert the parameter at</param>\r
+    /// <param name="value">The parameter to insert</param>\r
+    public override void Insert(int index, object value)\r
+    {\r
+      _unboundFlag = true;\r
+      _parameterList.Insert(index, (SqliteParameter)value);\r
+    }\r
+\r
+    /// <summary>\r
+    /// Removes a parameter from the collection\r
+    /// </summary>\r
+    /// <param name="value">The parameter to remove</param>\r
+    public override void Remove(object value)\r
+    {\r
+      _unboundFlag = true;\r
+      _parameterList.Remove((SqliteParameter)value);\r
+    }\r
+\r
+    /// <summary>\r
+    /// Removes a parameter from the collection given its name\r
+    /// </summary>\r
+    /// <param name="parameterName">The name of the parameter to remove</param>\r
+    public override void RemoveAt(string parameterName)\r
+    {\r
+      RemoveAt(IndexOf(parameterName));\r
+    }\r
+\r
+    /// <summary>\r
+    /// Removes a parameter from the collection given its index\r
+    /// </summary>\r
+    /// <param name="index">The zero-based parameter index to remove</param>\r
+    public override void RemoveAt(int index)\r
+    {\r
+      _unboundFlag = true;\r
+      _parameterList.RemoveAt(index);\r
+    }\r
+\r
+    /// <summary>\r
+    /// Re-assign the named parameter to a new parameter object\r
+    /// </summary>\r
+    /// <param name="parameterName">The name of the parameter to replace</param>\r
+    /// <param name="value">The new parameter</param>\r
+    protected override void SetParameter(string parameterName, DbParameter value)\r
+    {\r
+      SetParameter(IndexOf(parameterName), value);\r
+    }\r
+\r
+    /// <summary>\r
+    /// Re-assign a parameter at the specified index\r
+    /// </summary>\r
+    /// <param name="index">The zero-based index of the parameter to replace</param>\r
+    /// <param name="value">The new parameter</param>\r
+    protected override void SetParameter(int index, DbParameter value)\r
+    {\r
+      _unboundFlag = true;\r
+      _parameterList[index] = (SqliteParameter)value;\r
+    }\r
+\r
+    /// <summary>\r
+    /// Un-binds all parameters from their statements\r
+    /// </summary>\r
+    internal void Unbind()\r
+    {\r
+      _unboundFlag = true;\r
+    }\r
+\r
+    /// <summary>\r
+    /// This function attempts to map all parameters in the collection to all statements in a Command.\r
+    /// Since named parameters may span multiple statements, this function makes sure all statements are bound\r
+    /// to the same named parameter.  Unnamed parameters are bound in sequence.\r
+    /// </summary>\r
+    internal void MapParameters(SqliteStatement activeStatement)\r
+    {\r
+      if (_unboundFlag == false || _parameterList.Count == 0 || _command._statementList == null) return;\r
+\r
+      int nUnnamed = 0;\r
+      string s;\r
+      int n;\r
+      int y = -1;\r
+      SqliteStatement stmt;\r
+\r
+      foreach(SqliteParameter p in _parameterList)\r
+      {\r
+        y ++;\r
+        s = p.ParameterName;\r
+        if (s == null)\r
+        {\r
+          s = String.Format(CultureInfo.InvariantCulture, ";{0}", nUnnamed);\r
+          nUnnamed++;\r
+        }\r
+\r
+        int x;\r
+        bool isMapped = false;\r
+\r
+        if (activeStatement == null)\r
+          x = _command._statementList.Count;\r
+        else\r
+          x = 1;\r
+\r
+        stmt = activeStatement;\r
+        for (n = 0; n < x; n++)\r
+        {\r
+          isMapped = false;\r
+          if (stmt == null) stmt = _command._statementList[n];\r
+          if (stmt._paramNames != null)\r
+          {\r
+            if (stmt.MapParameter(s, p) == true)\r
+              isMapped = true;\r
+          }\r
+          stmt = null;\r
+        }\r
+\r
+        // If the parameter has a name, but the SQL statement uses unnamed references, this can happen -- attempt to map\r
+        // the parameter by its index in the collection\r
+        if (isMapped == false)\r
+        {\r
+          s = String.Format(CultureInfo.InvariantCulture, ";{0}", y);\r
+\r
+          stmt = activeStatement;\r
+          for (n = 0; n < x; n++)\r
+          {\r
+            if (stmt == null) stmt = _command._statementList[n];\r
+            if (stmt._paramNames != null)\r
+            {\r
+              if (stmt.MapParameter(s, p) == true)\r
+                isMapped = true;\r
+            }\r
+            stmt = null;\r
+          }\r
+        }\r
+      }\r
+      if (activeStatement == null) _unboundFlag = false;\r
+    }\r
+  }\r
+}\r