Пример #1
0
        /// <summary>
        /// Applies the current values in this object's parameter collection
        /// to the internal statement object, if any, that represents the
        /// prepared form of this command.
        /// </summary>
        /// <remarks>
        /// <para>
        /// If this command is not presently prepared, no action is taken.
        /// </para>
        /// <para>
        /// On the other hand, this operation is invoked internally whenever
        /// an <c>ExecuteXXX</c> operation is invoked on a prepared
        /// <c>HsqlCommand</c> instance.
        /// </para>
        /// </remarks>
        /// <param name="batch">
        /// <c>true</c> to apply the parameters toward batch execution
        /// </param>
        /// <exception cref="HsqlDataSourceException">
        /// When unbound parameters exist.  An unbound parameter condition
        /// occurs when a parameter's existence is declared in the command
        /// text using a marker or can be inferred from
        /// the signature of the stored procedure to be executed, and
        /// the parameter collection of this <c>HsqlCommand</c> contains
        /// no corresponding <c>HsqlParameter</c> instance or the
        /// corresponding <c>HsqlParameter</c> instance exists, but either
        /// it represents an explicitly required (non-defaulted) value binding
        /// site and the value has not explicitly been set or it represents a
        /// non-nullable binding site and its present value is either
        /// implicitly null or has explicily been set null.
        /// </exception>
        internal void ApplyParameters(bool batch)
        {
            HsqlStatement statement = m_statement;

            if (statement == null)
            {
                return;
            }

            HsqlParameterCollection parameters = m_dbParameterCollection;

            if (parameters == null || parameters.Count == 0)
            {
                int expectedCount = statement.ParameterCount;

                if (expectedCount == 0)
                {
                    statement.SetParameterValues(s_noParameters);

                    return;
                }

                throw new HsqlDataSourceException(string.Format(
                                                      "{0} unbound parameters exist.",
                                                      expectedCount)); // NOI18N
            }

            TokenList tokenList = TokenList;

            int[]    bindTypes = statement.ParameterTypes;
            object[] values    = new object[tokenList.ParameterCount];

            int boundValueCount = 0;

            foreach (HsqlParameter parameter in parameters)
            {
                switch (parameter.Direction)
                {
                case ParameterDirection.Input:
                case ParameterDirection.InputOutput:
                {
                    string name = parameter.ParameterName;

                    int[] bindPositions = tokenList
                                          .GetNamedParameterBindPositionsInternal(name);

                    for (int i = 0; i < bindPositions.Length; i++)
                    {
                        int bindPosition = bindPositions[i];
                        int bindType     = bindTypes[bindPosition];

                        object value = HsqlConvert.FromDotNet.ToObject(
                            parameter.Value, bindType);

                        values[bindPosition] = value;

                        boundValueCount++;
                    }

                    break;
                }
                }
            }

            if (boundValueCount < values.Length)
            {
                int unboundCount = (values.Length - boundValueCount);

                throw new HsqlDataSourceException(string.Format(
                                                      "{0} unbound Parameters Exist.", unboundCount)); // NOI18N
            }

            if (batch)
            {
                statement.AddBatch(values);
            }
            else
            {
                statement.SetParameterValues(values);
            }
        }