OleDbConnection.cs 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374
  1. //
  2. // System.Data.OleDb.OleDbConnection
  3. //
  4. // Authors:
  5. // Konstantin Triger <[email protected]>
  6. // Boris Kirzner <[email protected]>
  7. //
  8. // (C) 2005 Mainsoft Corporation (http://www.mainsoft.com)
  9. //
  10. //
  11. // Permission is hereby granted, free of charge, to any person obtaining
  12. // a copy of this software and associated documentation files (the
  13. // "Software"), to deal in the Software without restriction, including
  14. // without limitation the rights to use, copy, modify, merge, publish,
  15. // distribute, sublicense, and/or sell copies of the Software, and to
  16. // permit persons to whom the Software is furnished to do so, subject to
  17. // the following conditions:
  18. //
  19. // The above copyright notice and this permission notice shall be
  20. // included in all copies or substantial portions of the Software.
  21. //
  22. // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
  23. // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
  24. // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
  25. // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
  26. // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
  27. // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
  28. // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
  29. //
  30. using System.Data;
  31. using System.Data.Common;
  32. using System.Collections;
  33. using java.sql;
  34. namespace System.Data.OleDb
  35. {
  36. public sealed class OleDbConnection : AbstractDBConnection, System.ICloneable
  37. {
  38. #region Fields
  39. protected static Hashtable _skippedUserParameters = new Hashtable(new CaseInsensitiveHashCodeProvider(),new CaseInsensitiveComparer());
  40. private static DbStringManager _stringManager = new DbStringManager("System.Data.System.Data.ProviderBase.jvm.OleDbStrings");
  41. private static readonly string[] _resourceIgnoredKeys = new string[] {"CON_PROVIDER","CON_DATA_SOURCE","CON_DATABASE",
  42. "CON_PASSWORD","CON_USER_ID","CON_TIMEOUT",
  43. "CON_SERVER_NAME","CON_PORT","CON_SERVICE_NAME",
  44. "CON_JNDI_NAME","CON_JNDI_PROVIDER","CON_JNDI_FACTORY",
  45. "JDBC_DRIVER","JDBC_URL","DB2_CON_LOCATION" };
  46. #endregion //Fields
  47. #region Events
  48. public event OleDbInfoMessageEventHandler InfoMessage;
  49. public event StateChangeEventHandler StateChange;
  50. #endregion // Events
  51. #region Constructors
  52. public OleDbConnection() : this(null)
  53. {
  54. }
  55. public OleDbConnection(String connectionString) : base(connectionString)
  56. {
  57. }
  58. #endregion // Constructors
  59. #region Properties
  60. protected override string[] ResourceIgnoredKeys
  61. {
  62. get { return _resourceIgnoredKeys; }
  63. }
  64. public String Provider
  65. {
  66. get { return ConnectionStringHelper.FindValue(UserParameters,StringManager.GetStringArray("CON_PROVIDER")); }
  67. }
  68. protected override Hashtable SkippedUserParameters
  69. {
  70. get { return _skippedUserParameters; }
  71. }
  72. protected override string ServerName
  73. {
  74. get {
  75. if (ProviderType == PROVIDER_TYPE.IBMDADB2 || ProviderType == PROVIDER_TYPE.MSDAORA) {
  76. string host = ConnectionStringHelper.FindValue(UserParameters,StringManager.GetStringArray("CON_SERVER_NAME"));
  77. if (!String.Empty.Equals(host)) {
  78. return host;
  79. }
  80. if (ProviderType == PROVIDER_TYPE.IBMDADB2) {
  81. string location = ConnectionStringHelper.FindValue(UserParameters,StringManager.GetStringArray("DB2_CON_LOCATION"));
  82. if (!String.Empty.Equals(location)) {
  83. int semicolumnIndex = location.IndexOf(':');
  84. if (semicolumnIndex != -1) {
  85. return location.Substring(0,semicolumnIndex);
  86. }
  87. else {
  88. return location;
  89. }
  90. }
  91. }
  92. }
  93. return base.ServerName;
  94. }
  95. }
  96. protected override string CatalogName
  97. {
  98. get {
  99. switch (ProviderType) {
  100. case PROVIDER_TYPE.IBMDADB2:
  101. case PROVIDER_TYPE.MSDAORA:
  102. return DataSource;
  103. }
  104. return base.CatalogName;
  105. }
  106. }
  107. protected override string Port
  108. {
  109. get {
  110. string port = ConnectionStringHelper.FindValue(UserParameters, StringManager.GetStringArray("CON_PORT"));
  111. switch (ProviderType) {
  112. case PROVIDER_TYPE.MSDAORA :
  113. if (String.Empty.Equals(port)) {
  114. return StringManager.GetString("ORA_CON_PORT");
  115. }
  116. return port;
  117. case PROVIDER_TYPE.IBMDADB2 :
  118. if (String.Empty.Equals(port)) {
  119. string location = ConnectionStringHelper.FindValue(UserParameters,StringManager.GetStringArray("DB2_CON_LOCATION"));
  120. if (!String.Empty.Equals(location)) {
  121. int semicolumnIndex = location.IndexOf(':');
  122. if (semicolumnIndex != -1) {
  123. return location.Substring(semicolumnIndex + 1);
  124. }
  125. }
  126. return StringManager.GetString("DB2_CON_PORT");
  127. }
  128. return port;
  129. }
  130. return base.Port;
  131. }
  132. }
  133. protected override string JdbcDriverName
  134. {
  135. get {
  136. JDBC_MODE jdbcMode = JdbcMode;
  137. switch (jdbcMode) {
  138. case JDBC_MODE.DATA_SOURCE_MODE :
  139. return base.JdbcDriverName;
  140. case JDBC_MODE.JDBC_DRIVER_MODE :
  141. return ConnectionStringHelper.FindValue(UserParameters,StringManager.GetStringArray("JDBC_DRIVER"));
  142. case JDBC_MODE.PROVIDER_MODE:
  143. switch (ProviderType) {
  144. case PROVIDER_TYPE.SQLOLEDB :
  145. return StringManager.GetString("SQL_JDBC_DRIVER");
  146. case PROVIDER_TYPE.MSDAORA :
  147. return StringManager.GetString("ORA_JDBC_DRIVER");
  148. case PROVIDER_TYPE.IBMDADB2 :
  149. return StringManager.GetString("DB2_JDBC_DRIVER");
  150. }
  151. break;
  152. };
  153. return base.JdbcDriverName;
  154. }
  155. }
  156. protected override DbStringManager StringManager
  157. {
  158. get { return _stringManager; }
  159. }
  160. #endregion // Properties
  161. #region Methods
  162. public new OleDbTransaction BeginTransaction(IsolationLevel level)
  163. {
  164. return new OleDbTransaction(level, this);
  165. }
  166. public new OleDbTransaction BeginTransaction()
  167. {
  168. return BeginTransaction(IsolationLevel.ReadCommitted);
  169. }
  170. public new OleDbCommand CreateCommand()
  171. {
  172. return new OleDbCommand(this);
  173. }
  174. protected override DbTransaction BeginDbTransaction(IsolationLevel isolationLevel) {
  175. return BeginTransaction();
  176. }
  177. protected override DbCommand CreateDbCommand() {
  178. return CreateCommand();
  179. }
  180. protected internal override void CopyTo(AbstractDBConnection target)
  181. {
  182. base.CopyTo(target);
  183. }
  184. public object Clone()
  185. {
  186. OleDbConnection clone = new OleDbConnection();
  187. CopyTo(clone);
  188. return clone;
  189. }
  190. protected override SystemException CreateException(SQLException e)
  191. {
  192. return new OleDbException(e,this);
  193. }
  194. public DataTable GetOleDbSchemaTable (Guid schema, object[] restrictions)
  195. {
  196. DataTable schemaTable = new DataTable("Tables");
  197. schemaTable.Columns.Add("TABLE_CATALOG");
  198. schemaTable.Columns.Add("TABLE_SCHEMA");
  199. schemaTable.Columns.Add("TABLE_NAME");
  200. schemaTable.Columns.Add("TABLE_TYPE");
  201. schemaTable.Columns.Add("TABLE_GUID");
  202. schemaTable.Columns.Add("DESCRIPTION");
  203. schemaTable.Columns.Add("TABLE_PROPID");
  204. schemaTable.Columns.Add("DATE_CREATED");
  205. schemaTable.Columns.Add("DATE_MODIFIED");
  206. Connection con = JdbcConnection;
  207. String catalog = con.getCatalog();
  208. DatabaseMetaData meta = con.getMetaData();
  209. ResultSet schemaRes = meta.getSchemas();
  210. System.Collections.ArrayList schemas = new System.Collections.ArrayList();
  211. while(schemaRes.next()) {
  212. schemas.Add(schemaRes.getString(1));
  213. }
  214. schemaRes.close();
  215. for(int i = 0; i < schemas.Count; i++) {
  216. ResultSet tableRes = meta.getTables(catalog, schemas[i].ToString(), null, null);
  217. while(tableRes.next()) {
  218. DataRow row = schemaTable.NewRow();
  219. row["TABLE_CATALOG"] = catalog;
  220. row["TABLE_SCHEMA"] = schemas[i];
  221. row["TABLE_NAME"] = tableRes.getString("TABLE_NAME");
  222. row["TABLE_TYPE"] = tableRes.getString("TABLE_TYPE");
  223. row["DESCRIPTION"] = tableRes.getString("REMARKS");
  224. schemaTable.Rows.Add(row);
  225. }
  226. tableRes.close();
  227. }
  228. return schemaTable;
  229. }
  230. protected internal override void ValidateConnectionString(string connectionString)
  231. {
  232. base.ValidateConnectionString(connectionString);
  233. JDBC_MODE currentJdbcMode = JdbcMode;
  234. if (currentJdbcMode == JDBC_MODE.NONE) {
  235. string provider = StringManager.GetString("CON_PROVIDER");
  236. if (String.Empty.Equals(provider)) {
  237. throw ExceptionHelper.OleDbNoProviderSpecified();
  238. }
  239. }
  240. }
  241. protected override string BuildJdbcUrl()
  242. {
  243. switch (JdbcMode) {
  244. case JDBC_MODE.PROVIDER_MODE :
  245. switch (ProviderType) {
  246. case PROVIDER_TYPE.IBMDADB2:
  247. return BuildDb2Url();
  248. case PROVIDER_TYPE.MSDAORA:
  249. return BuildOracleUrl();
  250. case PROVIDER_TYPE.SQLOLEDB:
  251. return BuildMsSqlUrl();
  252. }
  253. break;
  254. }
  255. return base.BuildJdbcUrl();
  256. }
  257. public static void ReleaseObjectPool()
  258. {
  259. // since we're using connection pool from app servet, this is by design
  260. //throw new NotImplementedException();
  261. }
  262. internal override void OnSqlWarning(SQLWarning warning)
  263. {
  264. OleDbErrorCollection col = new OleDbErrorCollection(warning, this);
  265. OnOleDbInfoMessage(new OleDbInfoMessageEventArgs(col));
  266. }
  267. internal override Connection GetConnectionFromProvider()
  268. {
  269. if ((ProviderType == PROVIDER_TYPE.MSDAORA) &&
  270. ("true").Equals(StringManager.GetString("ORA_CONNECTION_POOLING_ENABLED","false"))) {
  271. ActivateJdbcDriver(JdbcDriverName);
  272. return OleDbConnectionFactory.GetConnection(ProviderType,JdbcUrl,User,Password,ConnectionTimeout);
  273. }
  274. else {
  275. return base.GetConnectionFromProvider();
  276. }
  277. }
  278. private String BuildDb2Url()
  279. {
  280. return StringManager.GetString("DB2_JDBC_URL") //jdbc:db2://
  281. + ServerName + ":" + Port + "/" + CatalogName;
  282. }
  283. private String BuildOracleUrl()
  284. {
  285. return StringManager.GetString("ORA_JDBC_URL") //"jdbc:oracle:thin:@"
  286. + ServerName + ":" + Port + ":" + CatalogName;
  287. }
  288. internal override void OnStateChanged(ConnectionState orig, ConnectionState current)
  289. {
  290. if(StateChange != null) {
  291. StateChange(this, new StateChangeEventArgs(orig, current));
  292. }
  293. }
  294. public override void Close()
  295. {
  296. ConnectionState orig = State;
  297. base.Close();
  298. ConnectionState current = State;
  299. if(current != orig) {
  300. OnStateChanged(orig, current);
  301. }
  302. }
  303. private void OnOleDbInfoMessage (OleDbInfoMessageEventArgs value)
  304. {
  305. if (InfoMessage != null) {
  306. InfoMessage (this, value);
  307. }
  308. }
  309. #endregion // Methods
  310. }
  311. }