2 // System.Data.OleDb.OleDbConnection
\r
5 // Konstantin Triger <kostat@mainsoft.com>
6 // Boris Kirzner <borisk@mainsoft.com>
8 // (C) 2005 Mainsoft Corporation (http://www.mainsoft.com)
12 // Permission is hereby granted, free of charge, to any person obtaining
13 // a copy of this software and associated documentation files (the
14 // "Software"), to deal in the Software without restriction, including
15 // without limitation the rights to use, copy, modify, merge, publish,
16 // distribute, sublicense, and/or sell copies of the Software, and to
17 // permit persons to whom the Software is furnished to do so, subject to
18 // the following conditions:
20 // The above copyright notice and this permission notice shall be
21 // included in all copies or substantial portions of the Software.
23 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
24 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
25 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
26 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
27 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
28 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
29 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
35 using System.Data.Common;
\r
36 using System.Collections;
\r
40 namespace System.Data.OleDb
\r
42 public sealed class OleDbConnection : AbstractDBConnection, System.ICloneable
\r
46 protected static Hashtable _skippedUserParameters = new Hashtable(new CaseInsensitiveHashCodeProvider(),new CaseInsensitiveComparer());
\r
48 private static DbStringManager _stringManager = new DbStringManager("System.Data.System.Data.ProviderBase.jvm.OleDbStrings");
\r
50 private static readonly string[] _resourceIgnoredKeys = new string[] {"CON_PROVIDER","CON_DATA_SOURCE","CON_DATABASE",
\r
51 "CON_PASSWORD","CON_USER_ID","CON_TIMEOUT",
\r
52 "CON_SERVER_NAME","CON_PORT","CON_SERVICE_NAME",
\r
53 "CON_JNDI_NAME","CON_JNDI_PROVIDER","CON_JNDI_FACTORY",
\r
54 "JDBC_DRIVER","JDBC_URL","DB2_CON_LOCATION" };
\r
60 public event OleDbInfoMessageEventHandler InfoMessage;
\r
61 public event StateChangeEventHandler StateChange;
\r
63 #endregion // Events
\r
65 #region Constructors
\r
67 public OleDbConnection() : this(null)
\r
71 public OleDbConnection(String connectionString) : base(connectionString)
\r
75 #endregion // Constructors
\r
79 protected override string[] ResourceIgnoredKeys
\r
81 get { return _resourceIgnoredKeys; }
\r
84 public String Provider
\r
86 get { return ConnectionStringHelper.FindValue(UserParameters,StringManager.GetStringArray("CON_PROVIDER")); }
\r
89 protected override Hashtable SkippedUserParameters
\r
91 get { return _skippedUserParameters; }
\r
94 protected override string ServerName
\r
97 if (ProviderType == PROVIDER_TYPE.IBMDADB2 || ProviderType == PROVIDER_TYPE.MSDAORA) {
\r
98 string host = ConnectionStringHelper.FindValue(UserParameters,StringManager.GetStringArray("CON_SERVER_NAME"));
\r
100 if (!String.Empty.Equals(host)) {
\r
104 if (ProviderType == PROVIDER_TYPE.IBMDADB2) {
\r
105 string location = ConnectionStringHelper.FindValue(UserParameters,StringManager.GetStringArray("DB2_CON_LOCATION"));
\r
107 if (!String.Empty.Equals(location)) {
\r
108 int semicolumnIndex = location.IndexOf(':');
\r
109 if (semicolumnIndex != -1) {
\r
110 return location.Substring(0,semicolumnIndex);
\r
119 return base.ServerName;
\r
123 protected override string CatalogName
\r
126 switch (ProviderType) {
\r
127 case PROVIDER_TYPE.IBMDADB2:
\r
128 case PROVIDER_TYPE.MSDAORA:
\r
131 return base.CatalogName;
\r
135 protected override string Port
\r
138 string port = ConnectionStringHelper.FindValue(UserParameters, StringManager.GetStringArray("CON_PORT"));
\r
139 switch (ProviderType) {
\r
140 case PROVIDER_TYPE.MSDAORA :
\r
141 if (String.Empty.Equals(port)) {
\r
142 return StringManager.GetString("ORA_CON_PORT");
\r
145 case PROVIDER_TYPE.IBMDADB2 :
\r
146 if (String.Empty.Equals(port)) {
\r
147 string location = ConnectionStringHelper.FindValue(UserParameters,StringManager.GetStringArray("DB2_CON_LOCATION"));
\r
149 if (!String.Empty.Equals(location)) {
\r
150 int semicolumnIndex = location.IndexOf(':');
\r
151 if (semicolumnIndex != -1) {
\r
152 return location.Substring(semicolumnIndex + 1);
\r
155 return StringManager.GetString("DB2_CON_PORT");
\r
163 protected override string JdbcDriverName
\r
166 JDBC_MODE jdbcMode = JdbcMode;
\r
167 switch (jdbcMode) {
\r
168 case JDBC_MODE.DATA_SOURCE_MODE :
\r
169 return base.JdbcDriverName;
\r
170 case JDBC_MODE.JDBC_DRIVER_MODE :
\r
171 return ConnectionStringHelper.FindValue(UserParameters,StringManager.GetStringArray("JDBC_DRIVER"));
\r
172 case JDBC_MODE.PROVIDER_MODE:
\r
173 switch (ProviderType) {
\r
174 case PROVIDER_TYPE.SQLOLEDB :
\r
175 return StringManager.GetString("SQL_JDBC_DRIVER");
\r
176 case PROVIDER_TYPE.MSDAORA :
\r
177 return StringManager.GetString("ORA_JDBC_DRIVER");
\r
178 case PROVIDER_TYPE.IBMDADB2 :
\r
179 return StringManager.GetString("DB2_JDBC_DRIVER");
\r
183 return base.JdbcDriverName;
\r
187 protected override DbStringManager StringManager
\r
189 get { return _stringManager; }
\r
192 #endregion // Properties
\r
196 public new OleDbTransaction BeginTransaction(IsolationLevel level)
\r
198 return new OleDbTransaction(level, this);
\r
201 public new OleDbTransaction BeginTransaction()
\r
203 return BeginTransaction(IsolationLevel.ReadCommitted);
\r
206 public new OleDbCommand CreateCommand()
\r
208 return new OleDbCommand(this);
\r
211 protected override DbTransaction BeginDbTransaction(IsolationLevel isolationLevel) {
\r
212 return BeginTransaction();
\r
215 protected override DbCommand CreateDbCommand() {
\r
216 return CreateCommand();
\r
220 protected internal override void CopyTo(AbstractDBConnection target)
\r
222 base.CopyTo(target);
\r
225 public object Clone()
\r
227 OleDbConnection clone = new OleDbConnection();
\r
232 protected override SystemException CreateException(SQLException e)
\r
234 return new OleDbException(e,this);
\r
237 public DataTable GetOleDbSchemaTable (Guid schema, object[] restrictions)
\r
239 DataTable schemaTable = new DataTable("Tables");
\r
240 schemaTable.Columns.Add("TABLE_CATALOG");
\r
241 schemaTable.Columns.Add("TABLE_SCHEMA");
\r
242 schemaTable.Columns.Add("TABLE_NAME");
\r
243 schemaTable.Columns.Add("TABLE_TYPE");
\r
244 schemaTable.Columns.Add("TABLE_GUID");
\r
245 schemaTable.Columns.Add("DESCRIPTION");
\r
246 schemaTable.Columns.Add("TABLE_PROPID");
\r
247 schemaTable.Columns.Add("DATE_CREATED");
\r
248 schemaTable.Columns.Add("DATE_MODIFIED");
\r
251 Connection con = JdbcConnection;
\r
252 String catalog = con.getCatalog();
\r
254 DatabaseMetaData meta = con.getMetaData();
\r
255 ResultSet schemaRes = meta.getSchemas();
\r
256 System.Collections.ArrayList schemas = new System.Collections.ArrayList();
\r
257 while(schemaRes.next()) {
\r
258 schemas.Add(schemaRes.getString(1));
\r
262 for(int i = 0; i < schemas.Count; i++) {
\r
263 ResultSet tableRes = meta.getTables(catalog, schemas[i].ToString(), null, null);
\r
264 while(tableRes.next()) {
\r
265 DataRow row = schemaTable.NewRow();
\r
266 row["TABLE_CATALOG"] = catalog;
\r
267 row["TABLE_SCHEMA"] = schemas[i];
\r
268 row["TABLE_NAME"] = tableRes.getString("TABLE_NAME");
\r
269 row["TABLE_TYPE"] = tableRes.getString("TABLE_TYPE");
\r
270 row["DESCRIPTION"] = tableRes.getString("REMARKS");
\r
272 schemaTable.Rows.Add(row);
\r
276 return schemaTable;
\r
279 protected internal override void ValidateConnectionString(string connectionString)
\r
281 base.ValidateConnectionString(connectionString);
\r
283 JDBC_MODE currentJdbcMode = JdbcMode;
\r
285 if (currentJdbcMode == JDBC_MODE.NONE) {
\r
286 string provider = StringManager.GetString("CON_PROVIDER");
\r
288 if (String.Empty.Equals(provider)) {
\r
289 throw ExceptionHelper.OleDbNoProviderSpecified();
\r
294 protected override string BuildJdbcUrl()
\r
296 switch (JdbcMode) {
\r
297 case JDBC_MODE.PROVIDER_MODE :
\r
298 switch (ProviderType) {
\r
299 case PROVIDER_TYPE.IBMDADB2:
\r
300 return BuildDb2Url();
\r
301 case PROVIDER_TYPE.MSDAORA:
\r
302 return BuildOracleUrl();
\r
303 case PROVIDER_TYPE.SQLOLEDB:
\r
304 return BuildMsSqlUrl();
\r
308 return base.BuildJdbcUrl();
\r
311 public static void ReleaseObjectPool()
\r
313 // since we're using connection pool from app servet, this is by design
\r
314 //throw new NotImplementedException();
\r
317 internal override void OnSqlWarning(SQLWarning warning)
\r
319 OleDbErrorCollection col = new OleDbErrorCollection(warning, this);
\r
320 OnOleDbInfoMessage(new OleDbInfoMessageEventArgs(col));
\r
323 internal override Connection GetConnectionFromProvider()
\r
325 if ((ProviderType == PROVIDER_TYPE.MSDAORA) &&
\r
326 ("true").Equals(StringManager.GetString("ORA_CONNECTION_POOLING_ENABLED","false"))) {
\r
327 ActivateJdbcDriver(JdbcDriverName);
\r
328 return OleDbConnectionFactory.GetConnection(ProviderType,JdbcUrl,User,Password,ConnectionTimeout);
\r
331 return base.GetConnectionFromProvider();
\r
335 private String BuildDb2Url()
\r
337 return StringManager.GetString("DB2_JDBC_URL") //jdbc:db2://
\r
338 + ServerName + ":" + Port + "/" + CatalogName;
\r
341 private String BuildOracleUrl()
\r
343 return StringManager.GetString("ORA_JDBC_URL") //"jdbc:oracle:thin:@"
\r
344 + ServerName + ":" + Port + ":" + CatalogName;
\r
347 internal override void OnStateChanged(ConnectionState orig, ConnectionState current)
\r
349 if(StateChange != null) {
\r
350 StateChange(this, new StateChangeEventArgs(orig, current));
\r
354 public override void Close()
\r
356 ConnectionState orig = State;
\r
358 ConnectionState current = State;
\r
359 if(current != orig) {
\r
360 OnStateChanged(orig, current);
\r
364 private void OnOleDbInfoMessage (OleDbInfoMessageEventArgs value)
366 if (InfoMessage != null) {
367 InfoMessage (this, value);
371 #endregion // Methods
\r