context: //
  // System.Data.OleDb.OleDbCommand
  //
  // Authors:
  //	Konstantin Triger <kostat@mainsoft.com>
  //	Boris Kirzner <borisk@mainsoft.com>
  //	
  // (C) 2005 Mainsoft Corporation (http://www.mainsoft.com)
  //
  
  //
  // 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.
  //
  
  
  using System;
  using System.Collections;
  using System.Text;
  using System.Text.RegularExpressions;
  using System.Data;
  using System.Data.Common;
  using System.Data.ProviderBase;
  
  using java.sql;
  // Cannot use this because it makes ArrayList ambiguous reference
  //using java.util;
  
  namespace System.Data.OleDb
  {
  	public sealed class OleDbCommand : AbstractDbCommand
  	{
  
  		#region Fields
  
  		internal static readonly int oracleTypeRefCursor = java.sql.Types.OTHER;
  		private static readonly int _oracleRefCursor = -10; // oracle.jdbc.OracleTypes.CURSOR
  		private int _currentParameterIndex = 0;
  		private ResultSet _currentRefCursor;
  
  		#endregion // Fields
  
  		#region Constructors
  
  		static OleDbCommand()
  		{
  			try {
  				java.lang.Class OracleTypesClass = java.lang.Class.forName("oracle.jdbc.OracleTypes");
  				_oracleRefCursor = OracleTypesClass.getField("CURSOR").getInt(null);
  			}
  			catch(java.lang.ClassNotFoundException e) {
  				// oracle driver is not in classpath - just continue
  			}
  		}
  
  		/**
  		 * Initializes a new instance of the OleDbCommand class.
  		 * The base constructor initializes all fields to their default values.
  		 * The following table shows initial property values for an instance of SqlCommand.
  		 */
  		public OleDbCommand() : this(null, null, null)
  		{
  		}
  
  		public OleDbCommand(OleDbConnection connection) : this(null, connection, null)
  		{
  		}
  
  		/**
  		 * Initializes a new instance of the OleDbCommand class with the text of the query.
  		 * @param cmdText The text of the query.
  		 */
  		public OleDbCommand(String cmdText) : this(cmdText, null, null)
  		{
  		}
  
  		/**
  		 * Initializes a new instance of the OleDbCommand class with the text of the query and a SqlConnection.
  		 * @param cmdText The text of the query.
  		 * @param connection A SqlConnection that represents the connection to an instance of SQL Server.
  		 */
  		public OleDbCommand(String cmdText, OleDbConnection connection) : this(cmdText, connection, null)
  		{
  		}
  
  		/**
  		 * Initializes a new instance of the OleDbCommand class with the text of the query, a SqlConnection, and the Transaction.
  		 * @param cmdText The text of the query.
  		 * @param connection A SqlConnection that represents the connection to an instance of SQL Server.
  		 * @param transaction The SqlTransaction in which the OleDbCommand executes.
  		 */
  		public OleDbCommand(
  			String cmdText,
  			OleDbConnection connection,
  			OleDbTransaction transaction)
  			: base(cmdText, connection, transaction)
  		{
  		}
  
  		#endregion // Constructors
  
  		#region Properties
  
  		public new OleDbConnection Connection
  		{
  			get { return (OleDbConnection)base.Connection; }
  			set { base.Connection = (AbstractDBConnection)value; }
  		}
  
  		public new OleDbParameterCollection Parameters
  		{
  			get { 
  				return (OleDbParameterCollection)base.Parameters; 
  			}
  		}
  
  		public new OleDbTransaction Transaction
  		{
  			get { return (OleDbTransaction)base.Transaction; }
  			set { base.Transaction = (DbTransaction)value; }
  		}
  
  		protected internal sealed override ResultSet CurrentResultSet
  		{
  			get { 
  				try {
  					ResultSet resultSet = base.CurrentResultSet;
   
  					if (resultSet != null) {
  						return resultSet;						
  					}
  					return CurrentRefCursor;
  				}
  				catch(SQLException e) {
  					throw CreateException(e);
  				}
  			}
  		}
  
  		private ResultSet CurrentRefCursor
  		{
  			get {
  				if (_currentParameterIndex < 0) {
  					NextRefCursor();
  				}
  				if (_currentRefCursor == null && _currentParameterIndex < InternalParameters.Count) {
  					_currentRefCursor = (ResultSet)((CallableStatement)Statement).getObject(_currentParameterIndex + 1);
  				}
  				return _currentRefCursor;
  			}
  		}
  
  		#endregion // Properties
  
  		#region Methods
  
  		public new OleDbDataReader ExecuteReader()
  		{
  			return (OleDbDataReader)ExecuteReader(CommandBehavior.Default);
  		}
  
  		public new OleDbDataReader ExecuteReader(CommandBehavior behavior)
  		{
  			return (OleDbDataReader)base.ExecuteReader(behavior);
  		}
  
  		public new OleDbParameter CreateParameter()
  		{
  			return (OleDbParameter)CreateParameterInternal();
  		} 
  
  		protected sealed override void CheckParameters()
  		{
  			for(int i = 0; i < Parameters.Count; i++) {
  				OleDbParameter parameter = (OleDbParameter)Parameters[i];
  				if ((parameter.OleDbType == OleDbType.Empty) || (parameter.OleDbType == OleDbType.Error)) {
  					throw ExceptionHelper.ParametersNotInitialized(i,parameter.ParameterName,parameter.OleDbType.ToString());
  				}
  
  				if (((parameter.OleDbType == OleDbType.Char) || (parameter.OleDbType == OleDbType.Binary) ||
  					(parameter.OleDbType == OleDbType.VarWChar) || (parameter.OleDbType == OleDbType.VarBinary) ||
  					(parameter.OleDbType == OleDbType.VarNumeric)) && (parameter.Size == 0)) {
  					throw ExceptionHelper.WrongParameterSize("OleDb");
  				}
  			}
  		}
  
  		protected sealed override DbParameter CreateParameterInternal()
  		{
  			return new OleDbParameter();
  		}
  
  		protected sealed override DbParameterCollection CreateParameterCollection(AbstractDbCommand parent)
  		{
  
gt: 			return new OleDbParameterCollection((OleDbCommand)parent);