protected override DbSqlParserColumnCollection GatherTableColumns(DbSqlParserTable table) { OciStatementHandle stmtp = new OciStatementHandle(this._connection.ServiceContextHandle); OciErrorHandle errorHandle = this._connection.ErrorHandle; StringBuilder builder = new StringBuilder(); string schemaName = table.SchemaName; string tableName = table.TableName; DbSqlParserColumnCollection columns = new DbSqlParserColumnCollection(); builder.Append("select * from "); if (!System.Data.Common.ADP.IsEmpty(schemaName)) { builder.Append(schemaName); builder.Append("."); } builder.Append(tableName); string stmt = builder.ToString(); if ((TracedNativeMethods.OCIStmtPrepare(stmtp, errorHandle, stmt, OCI.SYNTAX.OCI_NTV_SYNTAX, OCI.MODE.OCI_DEFAULT, this._connection) == 0) && (TracedNativeMethods.OCIStmtExecute(this._connection.ServiceContextHandle, stmtp, errorHandle, 0, OCI.MODE.OCI_DESCRIBE_ONLY) == 0)) { int num3; stmtp.GetAttribute(OCI.ATTR.OCI_ATTR_PARAM_COUNT, out num3, errorHandle); for (int i = 0; i < num3; i++) { string str; OciParameterDescriptor handle = stmtp.GetDescriptor(i, errorHandle); handle.GetAttribute(OCI.ATTR.OCI_ATTR_SQLCODE, out str, errorHandle, this._connection); OciHandle.SafeDispose(ref handle); str = this.QuotePrefixCharacter + str + this.QuoteSuffixCharacter; columns.Add(null, schemaName, tableName, str, null); } } OciHandle.SafeDispose(ref stmtp); return(columns); }
public override void Prepare() { IntPtr ptr; OracleConnection.ExecutePermission.Demand(); Bid.ScopeEnter(out ptr, "<ora.OracleCommand.Prepare|API> %d#\n", this.ObjectID); try { if (this.ConnectionIsClosed) { throw System.Data.Common.ADP.ClosedConnectionError(); } if (System.Data.CommandType.Text == this.CommandType) { short num2; OciStatementHandle statementHandle = this.GetStatementHandle(); int closeCount = this._connection.CloseCount; string statementText = this.StatementText; int rc = TracedNativeMethods.OCIStmtPrepare(statementHandle, this.ErrorHandle, statementText, OCI.SYNTAX.OCI_NTV_SYNTAX, OCI.MODE.OCI_DEFAULT, this.Connection); if (rc != 0) { this.Connection.CheckError(this.ErrorHandle, rc); } statementHandle.GetAttribute(OCI.ATTR.OCI_ATTR_STMT_TYPE, out num2, this.ErrorHandle); this._statementType = (OCI.STMT)num2; if (OCI.STMT.OCI_STMT_SELECT == this._statementType) { rc = TracedNativeMethods.OCIStmtExecute(this._connection.ServiceContextHandle, statementHandle, this.ErrorHandle, 0, OCI.MODE.OCI_DESCRIBE_ONLY); if (rc != 0) { this.Connection.CheckError(this.ErrorHandle, rc); } } if (statementHandle != this._preparedStatementHandle) { OciHandle.SafeDispose(ref this._preparedStatementHandle); } this._preparedStatementHandle = statementHandle; this._preparedAtCloseCount = closeCount; } else if (this._preparedStatementHandle != null) { OciHandle.SafeDispose(ref this._preparedStatementHandle); } } finally { Bid.ScopeLeave(ref ptr); } }
private int ExecuteNonQueryInternal(bool needRowid, out OciRowidDescriptor rowidDescriptor) { OciStatementHandle statementHandle = null; int num = -1; try { try { ArrayList resultParameterOrdinals = new ArrayList(); statementHandle = this.GetStatementHandle(); this.Execute(statementHandle, CommandBehavior.Default, needRowid, out rowidDescriptor, out resultParameterOrdinals); if (resultParameterOrdinals != null) { num = 0; foreach (int num2 in resultParameterOrdinals) { OracleParameter parameter = this._parameterCollection[num2]; if (OracleType.Cursor != parameter.OracleType) { num += (int)parameter.Value; } } return(num); } if (OCI.STMT.OCI_STMT_SELECT != this._statementType) { statementHandle.GetAttribute(OCI.ATTR.OCI_ATTR_ROW_COUNT, out num, this.ErrorHandle); } return(num); } finally { if (statementHandle != null) { this.ReleaseStatementHandle(statementHandle); } } } catch { throw; } return(num); }
internal string Execute(OciStatementHandle statementHandle, CommandBehavior behavior, bool needRowid, out OciRowidDescriptor rowidDescriptor, out ArrayList resultParameterOrdinals) { if (this.ConnectionIsClosed) { throw System.Data.Common.ADP.ClosedConnectionError(); } if ((this._transaction == null) && (this.Connection.Transaction != null)) { throw System.Data.Common.ADP.TransactionRequired(); } if (((this._transaction != null) && (this._transaction.Connection != null)) && (this.Connection != this._transaction.Connection)) { throw System.Data.Common.ADP.TransactionConnectionMismatch(); } rowidDescriptor = null; this.Connection.RollbackDeadTransaction(); int rc = 0; NativeBuffer parameterBuffer = null; bool success = false; bool[] flagArray = null; SafeHandle[] handleArray = null; OracleParameterBinding[] bindingArray = null; string stmt = null; resultParameterOrdinals = null; RuntimeHelpers.PrepareConstrainedRegions(); try { int num8; short num13; if (this._preparedStatementHandle != statementHandle) { stmt = this.StatementText; rc = TracedNativeMethods.OCIStmtPrepare(statementHandle, this.ErrorHandle, stmt, OCI.SYNTAX.OCI_NTV_SYNTAX, OCI.MODE.OCI_DEFAULT, this.Connection); if (rc != 0) { this.Connection.CheckError(this.ErrorHandle, rc); } } statementHandle.GetAttribute(OCI.ATTR.OCI_ATTR_STMT_TYPE, out num13, this.ErrorHandle); this._statementType = (OCI.STMT)num13; if (OCI.STMT.OCI_STMT_SELECT != this._statementType) { num8 = 1; } else { num8 = 0; if (CommandBehavior.SingleRow != behavior) { statementHandle.SetAttribute(OCI.ATTR.OCI_ATTR_PREFETCH_ROWS, 0, this.ErrorHandle); statementHandle.SetAttribute(OCI.ATTR.OCI_ATTR_PREFETCH_MEMORY, 0, this.ErrorHandle); } } OCI.MODE mode = OCI.MODE.OCI_DEFAULT; if (num8 == 0) { if (IsBehavior(behavior, CommandBehavior.SchemaOnly)) { mode |= OCI.MODE.OCI_DESCRIBE_ONLY; } } else if (this._connection.TransactionState == TransactionState.AutoCommit) { mode |= OCI.MODE.OCI_COMMIT_ON_SUCCESS; } else if (TransactionState.GlobalStarted != this._connection.TransactionState) { this._connection.TransactionState = TransactionState.LocalStarted; } if ((((mode & OCI.MODE.OCI_DESCRIBE_ONLY) == OCI.MODE.OCI_DEFAULT) && (this._parameterCollection != null)) && (this._parameterCollection.Count > 0)) { int offset = 0; int count = this._parameterCollection.Count; flagArray = new bool[count]; handleArray = new SafeHandle[count]; bindingArray = new OracleParameterBinding[count]; for (int i = 0; i < count; i++) { bindingArray[i] = new OracleParameterBinding(this, this._parameterCollection[i]); bindingArray[i].PrepareForBind(this._connection, ref offset); if ((OracleType.Cursor == this._parameterCollection[i].OracleType) || (0 < this._parameterCollection[i].CommandSetResult)) { if (resultParameterOrdinals == null) { resultParameterOrdinals = new ArrayList(); } resultParameterOrdinals.Add(i); } } parameterBuffer = new NativeBuffer_ParameterBuffer(offset); parameterBuffer.DangerousAddRef(ref success); for (int j = 0; j < count; j++) { bindingArray[j].Bind(statementHandle, parameterBuffer, this._connection, ref flagArray[j], ref handleArray[j]); } } rc = TracedNativeMethods.OCIStmtExecute(this.ServiceContextHandle, statementHandle, this.ErrorHandle, num8, mode); if (rc != 0) { this.Connection.CheckError(this.ErrorHandle, rc); } if (bindingArray != null) { int length = bindingArray.Length; for (int k = 0; k < length; k++) { bindingArray[k].PostExecute(parameterBuffer, this._connection); bindingArray[k].Dispose(); bindingArray[k] = null; } bindingArray = null; } if (!needRowid || ((mode & OCI.MODE.OCI_DESCRIBE_ONLY) != OCI.MODE.OCI_DEFAULT)) { return(stmt); } switch (this._statementType) { case OCI.STMT.OCI_STMT_UPDATE: case OCI.STMT.OCI_STMT_DELETE: case OCI.STMT.OCI_STMT_INSERT: rowidDescriptor = statementHandle.GetRowid(this.EnvironmentHandle, this.ErrorHandle); return(stmt); } rowidDescriptor = null; } finally { if (success) { parameterBuffer.DangerousRelease(); } if (parameterBuffer != null) { parameterBuffer.Dispose(); parameterBuffer = null; } if (bindingArray != null) { int num10 = bindingArray.Length; for (int m = 0; m < num10; m++) { if (bindingArray[m] != null) { bindingArray[m].Dispose(); bindingArray[m] = null; } } bindingArray = null; } if ((flagArray != null) && (handleArray != null)) { int num9 = flagArray.Length; for (int n = 0; n < num9; n++) { if (flagArray[n]) { handleArray[n].DangerousRelease(); } } } } return(stmt); }