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; } } }