コード例 #1
0
        public override void SetCommandParameters(DbCommandType commandType, DbCommand command)
        {
            if (command == null)
            {
                return;
            }

            if (command.Parameters != null && command.Parameters.Count > 0)
            {
                return;
            }

            bool alreadyOpened = this._connection.State == ConnectionState.Open;

            try
            {
                if (!alreadyOpened)
                {
                    this._connection.Open();
                }

                if (this._transaction != null)
                {
                    command.Transaction = this._transaction;
                }

                var textParser = new ObjectNameParser(command.CommandText);

                if (derivingParameters.ContainsKey(textParser.UnquotedString))
                {
                    foreach (var p in derivingParameters[textParser.UnquotedString])
                    {
                        command.Parameters.Add(p.Clone());
                    }
                }
                else
                {
                    var parameters = _connection.DeriveParameters((OracleCommand)command, true, _transaction);

                    var arrayParameters = new List <OracleParameter>();
                    foreach (var p in parameters)
                    {
                        arrayParameters.Add(p.Clone());
                    }

                    derivingParameters.Add(textParser.UnquotedString, arrayParameters);
                }
            }
            catch (Exception ex)
            {
                Debug.WriteLine($"DeriveParameters failed : {ex}");
                throw;
            }
            finally
            {
                if (!alreadyOpened && this._connection.State != ConnectionState.Closed)
                {
                    this._connection.Close();
                }
            }


            foreach (var parameter in command.Parameters)
            {
                var sqlParameter = (OracleParameter)parameter;

                // try to get the source column (from the dmTable)
                var sqlParameterName = sqlParameter.ParameterName.Replace("@", "");
                sqlParameterName = sqlParameterName.Remove(sqlParameterName.Length - 1, 1);
                var colDesc = TableDescription.Columns.FirstOrDefault(c => string.Equals(c.ColumnName, sqlParameterName, StringComparison.CurrentCultureIgnoreCase));

                if (colDesc != null && !string.IsNullOrEmpty(colDesc.ColumnName))
                {
                    sqlParameter.SourceColumn = colDesc.ColumnName;
                }
            }
        }