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 // Original source code for setting ConnectionString
18 // by Tim Coleman <tim@timcoleman.com>
20 // Copyright (C) Tim Coleman, 2002
22 // Licensed under the MIT/X11 License.
26 using System
.Collections
;
27 using System
.Collections
.Specialized
;
28 using System
.ComponentModel
;
30 using System
.Data
.OracleClient
.Oci
;
31 using System
.Drawing
.Design
;
32 using System
.EnterpriseServices
;
35 namespace System
.Data
.OracleClient
37 internal struct OracleConnectionInfo
39 public string Username
;
40 public string Password
;
41 public string Database
;
44 [DefaultEvent ("InfoMessage")]
45 public sealed class OracleConnection
: Component
, ICloneable
, IDbConnection
50 ConnectionState state
;
51 OracleConnectionInfo conInfo
;
52 OracleTransaction transaction
= null;
53 string connectionString
= "";
54 OracleDataReader dataReader
= null;
60 public OracleConnection ()
62 state
= ConnectionState
.Closed
;
66 public OracleConnection (string connectionString
)
69 SetConnectionString (connectionString
);
72 #endregion // Constructors
76 int IDbConnection
.ConnectionTimeout
{
81 string IDbConnection
.Database
{
83 get { return String.Empty; }
86 internal OracleDataReader DataReader
{
87 get { return dataReader; }
88 set { dataReader = value; }
91 internal OciEnvironmentHandle Environment
{
92 get { return oci.Environment; }
95 internal OciErrorHandle ErrorHandle
{
96 get { return oci.ErrorHandle; }
99 internal OciServiceHandle ServiceContext
{
100 get { return oci.ServiceContext; }
104 [DesignerSerializationVisibility (DesignerSerializationVisibility
.Hidden
)]
105 public string DataSource
{
107 throw new NotImplementedException ();
112 [DesignerSerializationVisibility (DesignerSerializationVisibility
.Hidden
)]
113 public ConnectionState State
{
114 get { return state; }
118 [RecommendedAsConfigurable (true)]
119 [RefreshProperties (RefreshProperties
.All
)]
120 [Editor ("Microsoft.VSDesigner.Data.Oracle.Design.OracleConnectionStringEditor, " + Consts
.AssemblyMicrosoft_VSDesigner
, typeof(UITypeEditor
))]
121 public string ConnectionString
{
122 get { return connectionString; }
123 set { SetConnectionString (value); }
128 [DesignerSerializationVisibility (DesignerSerializationVisibility
.Hidden
)]
129 public string ServerVersion
{
131 throw new NotImplementedException ();
135 internal OciGlue Oci
{
139 internal OracleTransaction Transaction
{
140 get { return transaction; }
141 set { transaction = value; }
144 #endregion // Properties
148 public OracleTransaction
BeginTransaction ()
150 return BeginTransaction (IsolationLevel
.ReadCommitted
);
153 public OracleTransaction
BeginTransaction (IsolationLevel il
)
155 if (state
== ConnectionState
.Closed
)
156 throw new InvalidOperationException ("The connection is not open.");
157 if (transaction
!= null)
158 throw new InvalidOperationException ("OracleConnection does not support parallel transactions.");
160 OciTransactionHandle transactionHandle
= oci
.CreateTransaction ();
161 if (transactionHandle
== null)
162 throw new Exception("Error: Unable to start transaction");
164 transactionHandle
.Begin ();
165 transaction
= new OracleTransaction (this, il
, transactionHandle
);
172 void IDbConnection
.ChangeDatabase (string databaseName
)
174 throw new NotImplementedException ();
177 public OracleCommand
CreateCommand ()
179 OracleCommand command
= new OracleCommand ();
180 command
.Connection
= this;
185 object ICloneable
.Clone ()
187 throw new NotImplementedException ();
190 IDbTransaction IDbConnection
.BeginTransaction ()
192 return BeginTransaction ();
195 IDbTransaction IDbConnection
.BeginTransaction (IsolationLevel iso
)
197 return BeginTransaction (iso
);
200 IDbCommand IDbConnection
.CreateCommand ()
202 return CreateCommand ();
205 void IDisposable
.Dispose ()
208 GC
.SuppressFinalize (this);
212 protected override void Dispose (bool disposing
)
214 base.Dispose (disposing
);
218 public void EnlistDistributedTransaction (ITransaction distributedTransaction
)
220 throw new NotImplementedException ();
225 oci
.CreateConnection (conInfo
);
226 state
= ConnectionState
.Open
;
231 if (transaction
!= null)
232 transaction
.Rollback ();
235 state
= ConnectionState
.Closed
;
239 void SetConnectionString (string connectionString
)
241 this.connectionString
= connectionString
;
242 conInfo
.Username
= "";
243 conInfo
.Database
= "";
244 conInfo
.Password
= "";
246 if (connectionString
== String
.Empty
)
249 connectionString
+= ";";
250 NameValueCollection parameters
= new NameValueCollection ();
252 bool inQuote
= false;
253 bool inDQuote
= false;
255 string name
= String
.Empty
;
256 string value = String
.Empty
;
257 StringBuilder sb
= new StringBuilder ();
259 foreach (char c
in connectionString
) {
265 inDQuote
= !inDQuote
;
268 if (!inDQuote
&& !inQuote
) {
269 if (name
!= String
.Empty
&& name
!= null) {
270 value = sb
.ToString ();
271 parameters
[name
.ToUpper ().Trim ()] = value.Trim ();
274 value = String
.Empty
;
275 sb
= new StringBuilder ();
281 if (!inDQuote
&& !inQuote
) {
282 name
= sb
.ToString ();
283 sb
= new StringBuilder ();
294 SetProperties (parameters
);
297 private void SetProperties (NameValueCollection parameters
)
300 foreach (string name
in parameters
) {
301 value = parameters
[name
];
306 // set Database property
307 conInfo
.Database
= value;
311 conInfo
.Password
= value;
315 conInfo
.Username
= value;
318 throw new Exception("Connection parameter not supported." + name
);
323 #endregion // Methods
325 public event OracleInfoMessageEventHandler InfoMessage
;
326 public event StateChangeEventHandler StateChange
;