4 // Part of the Mono class libraries at
5 // mcs/class/System.Data.OracleClient/System.Data.OracleClient
7 // Assembly: System.Data.OracleClient.dll
8 // Namespace: System.Data.OracleClient
11 // Daniel Morgan <danmorg@sc.rr.com>
12 // Tim Coleman <tim@timcoleman.com>
14 // Copyright (C) Daniel Morgan, 2002
15 // Copyright (C) Tim Coleman , 2003
17 // Licensed under the MIT/X11 License.
21 using System.ComponentModel;
23 using System.Data.OracleClient.Oci;
25 namespace System.Data.OracleClient {
26 public class OracleCommand : Component, ICloneable, IDbCommand
30 bool disposed = false;
31 CommandBehavior behavior;
33 CommandType commandType;
34 OracleConnection connection;
35 bool designTimeVisible;
36 OracleParameterCollection parameters;
37 OracleTransaction transaction;
38 UpdateRowSource updatedRowSource;
40 OciStatementHandle preparedStatement;
41 OciStatementType statementType;
47 public OracleCommand ()
48 : this (String.Empty, null, null)
52 public OracleCommand (string commandText)
53 : this (commandText, null, null)
57 public OracleCommand (string commandText, OracleConnection connection)
58 : this (commandText, connection, null)
62 public OracleCommand (string commandText, OracleConnection connection, OracleTransaction tx)
64 preparedStatement = null;
65 CommandText = commandText;
66 Connection = connection;
68 CommandType = CommandType.Text;
69 UpdatedRowSource = UpdateRowSource.Both;
70 DesignTimeVisible = false;
72 parameters = new OracleParameterCollection (this);
75 #endregion // Constructors
79 public string CommandText {
80 get { return commandText; }
81 set { commandText = value; }
84 public CommandType CommandType {
85 get { return commandType; }
86 set { commandType = value; }
89 public OracleConnection Connection {
90 get { return connection; }
91 set { connection = value; }
94 public bool DesignTimeVisible {
95 get { return designTimeVisible; }
96 set { designTimeVisible = value; }
99 internal OciEnvironmentHandle Environment {
100 get { return Connection.Environment; }
103 internal OciErrorHandle ErrorHandle {
104 get { return Connection.ErrorHandle; }
107 int IDbCommand.CommandTimeout {
112 IDbConnection IDbCommand.Connection {
113 get { return Connection; }
115 if (!(value is OracleConnection))
116 throw new InvalidCastException ("The value was not a valid OracleConnection.");
117 Connection = (OracleConnection) value;
121 IDataParameterCollection IDbCommand.Parameters {
122 get { return Parameters; }
125 IDbTransaction IDbCommand.Transaction {
126 get { return Transaction; }
128 if (!(value is OracleTransaction))
129 throw new ArgumentException ();
130 Transaction = (OracleTransaction) value;
134 public OracleParameterCollection Parameters {
135 get { return parameters; }
138 public OracleTransaction Transaction {
139 get { return transaction; }
140 set { transaction = value; }
143 public UpdateRowSource UpdatedRowSource {
144 get { return updatedRowSource; }
145 set { updatedRowSource = value; }
152 private void AssertCommandTextIsSet ()
154 if (CommandText == String.Empty || CommandText == null)
155 throw new InvalidOperationException ("The command text for this Command has not been set.");
158 private void AssertConnectionIsOpen ()
160 if (Connection == null || Connection.State == ConnectionState.Closed)
161 throw new InvalidOperationException ("An open Connection object is required to continue.");
164 private void AssertNoDataReader ()
166 if (Connection.DataReader != null)
167 throw new InvalidOperationException ("There is already an open DataReader associated with this Connection which must be closed first.");
170 private void AssertTransactionMatch ()
172 if (Connection.Transaction != null && Transaction != Connection.Transaction)
173 throw new InvalidOperationException ("Execute requires the Command object to have a Transaction object when the Connection object assigned to the command is in a pending local transaction. The Transaction property of the Command has not been initialized.");
176 private void BindParameters (OciStatementHandle statement)
178 foreach (OracleParameter p in Parameters)
179 p.Bind (statement, Connection);
183 public void Cancel ()
185 throw new NotImplementedException ();
189 public object Clone ()
191 throw new NotImplementedException ();
194 internal void CloseDataReader ()
196 Connection.DataReader = null;
197 if ((behavior & CommandBehavior.CloseConnection) != 0)
201 public OracleParameter CreateParameter ()
203 return new OracleParameter ();
206 private int ExecuteNonQueryInternal (OciStatementHandle statement)
208 if (preparedStatement == null)
209 statement.Prepare (CommandText);
211 BindParameters (statement);
212 statement.ExecuteNonQuery ();
214 int rowsAffected = statement.GetAttributeInt32 (OciAttributeType.RowCount, ErrorHandle);
216 statement.Dispose ();
220 public int ExecuteNonQuery ()
222 AssertConnectionIsOpen ();
223 AssertTransactionMatch ();
224 AssertCommandTextIsSet ();
226 if (Transaction != null)
227 Transaction.AttachToServiceContext ();
229 return ExecuteNonQueryInternal (GetStatementHandle ());
232 public int ExecuteOracleNonQuery (out OracleString rowid)
234 AssertConnectionIsOpen ();
235 AssertTransactionMatch ();
236 AssertCommandTextIsSet ();
238 if (Transaction != null)
239 Transaction.AttachToServiceContext ();
241 OciStatementHandle statement = GetStatementHandle ();
243 int retval = ExecuteNonQueryInternal (statement);
245 OciRowIdDescriptor descriptor = (OciRowIdDescriptor) Environment.Allocate (OciHandleType.RowId);
246 descriptor.SetHandle (statement.GetAttributeIntPtr (OciAttributeType.RowId, ErrorHandle));
248 rowid = new OracleString (descriptor.GetRowId (ErrorHandle));
254 public object ExecuteOracleScalar (out OracleString rowid)
256 throw new NotImplementedException ();
259 public OracleDataReader ExecuteReader ()
261 return ExecuteReader (CommandBehavior.Default);
264 public OracleDataReader ExecuteReader (CommandBehavior behavior)
266 AssertConnectionIsOpen ();
267 AssertTransactionMatch ();
268 AssertCommandTextIsSet ();
269 AssertNoDataReader ();
271 if (Transaction != null)
272 Transaction.AttachToServiceContext ();
274 OciStatementHandle statement = GetStatementHandle ();
276 if (preparedStatement == null)
277 statement.Prepare (CommandText);
278 BindParameters (statement);
279 statement.ExecuteQuery ();
281 return new OracleDataReader (this, statement);
284 public object ExecuteScalar ()
288 AssertConnectionIsOpen ();
289 AssertTransactionMatch ();
290 AssertCommandTextIsSet ();
292 if (Transaction != null)
293 Transaction.AttachToServiceContext ();
295 OciStatementHandle statement = GetStatementHandle ();
296 if (preparedStatement == null)
297 statement.Prepare (CommandText);
298 BindParameters (statement);
300 statement.ExecuteQuery ();
302 if (statement.Fetch ())
303 output = ((OciDefineHandle) statement.Values [0]).GetValue ();
305 output = DBNull.Value;
310 private OciStatementHandle GetStatementHandle ()
312 AssertConnectionIsOpen ();
313 if (preparedStatement != null)
314 return preparedStatement;
316 OciStatementHandle h = (OciStatementHandle) Connection.Environment.Allocate (OciHandleType.Statement);
317 h.ErrorHandle = Connection.ErrorHandle;
318 h.Service = Connection.ServiceContext;
322 IDbDataParameter IDbCommand.CreateParameter ()
324 return CreateParameter ();
327 IDataReader IDbCommand.ExecuteReader ()
329 return ExecuteReader ();
332 IDataReader IDbCommand.ExecuteReader (CommandBehavior behavior)
334 return ExecuteReader (behavior);
337 public void Prepare ()
339 AssertConnectionIsOpen ();
340 OciStatementHandle statement = GetStatementHandle ();
341 statement.Prepare (CommandText);
342 preparedStatement = statement;
345 #endregion // Methods