OleDbConnection.cs 9.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349
  1. //
  2. // System.Data.OleDb.OleDbConnection
  3. //
  4. // Author:
  5. // Boris Kirzner ([email protected])
  6. //
  7. using System.Data;
  8. using System.Data.Common;
  9. using System.Collections;
  10. using java.sql;
  11. namespace System.Data.OleDb
  12. {
  13. public sealed class OleDbConnection : AbstractDBConnection, System.ICloneable
  14. {
  15. #region Fields
  16. protected static Hashtable _skippedUserParameters = new Hashtable(new CaseInsensitiveHashCodeProvider(),new CaseInsensitiveComparer());
  17. private static DbStringManager _stringManager = new DbStringManager("System.Data.System.Data.ProviderBase.jvm.OleDbStrings");
  18. private static readonly string[] _resourceIgnoredKeys = new string[] {"CON_PROVIDER","CON_DATA_SOURCE","CON_DATABASE",
  19. "CON_PASSWORD","CON_USER_ID","CON_TIMEOUT",
  20. "CON_SERVER_NAME","CON_PORT","CON_SERVICE_NAME",
  21. "CON_JNDI_NAME","CON_JNDI_PROVIDER","CON_JNDI_FACTORY",
  22. "JDBC_DRIVER","JDBC_URL","DB2_CON_LOCATION" };
  23. #endregion //Fields
  24. #region Events
  25. public event OleDbInfoMessageEventHandler InfoMessage;
  26. public event StateChangeEventHandler StateChange;
  27. #endregion // Events
  28. #region Constructors
  29. public OleDbConnection() : this(null)
  30. {
  31. }
  32. public OleDbConnection(String connectionString) : base(connectionString)
  33. {
  34. }
  35. #endregion // Constructors
  36. #region Properties
  37. protected override string[] ResourceIgnoredKeys
  38. {
  39. get { return _resourceIgnoredKeys; }
  40. }
  41. public String Provider
  42. {
  43. get { return ConnectionStringHelper.FindValue(UserParameters,StringManager.GetStringArray("CON_PROVIDER")); }
  44. }
  45. protected override Hashtable SkippedUserParameters
  46. {
  47. get { return _skippedUserParameters; }
  48. }
  49. protected override string ServerName
  50. {
  51. get {
  52. if (ProviderType == PROVIDER_TYPE.IBMDADB2 || ProviderType == PROVIDER_TYPE.MSDAORA) {
  53. string host = ConnectionStringHelper.FindValue(UserParameters,StringManager.GetStringArray("CON_SERVER_NAME"));
  54. if (!String.Empty.Equals(host)) {
  55. return host;
  56. }
  57. if (ProviderType == PROVIDER_TYPE.IBMDADB2) {
  58. string location = ConnectionStringHelper.FindValue(UserParameters,StringManager.GetStringArray("DB2_CON_LOCATION"));
  59. if (!String.Empty.Equals(location)) {
  60. int semicolumnIndex = location.IndexOf(':');
  61. if (semicolumnIndex != -1) {
  62. return location.Substring(0,semicolumnIndex);
  63. }
  64. else {
  65. return location;
  66. }
  67. }
  68. }
  69. }
  70. return base.ServerName;
  71. }
  72. }
  73. protected override string CatalogName
  74. {
  75. get {
  76. switch (ProviderType) {
  77. case PROVIDER_TYPE.IBMDADB2:
  78. case PROVIDER_TYPE.MSDAORA:
  79. return DataSource;
  80. }
  81. return base.CatalogName;
  82. }
  83. }
  84. protected override string Port
  85. {
  86. get {
  87. string port = ConnectionStringHelper.FindValue(UserParameters, StringManager.GetStringArray("CON_PORT"));
  88. switch (ProviderType) {
  89. case PROVIDER_TYPE.MSDAORA :
  90. if (String.Empty.Equals(port)) {
  91. return StringManager.GetString("ORA_CON_PORT");
  92. }
  93. return port;
  94. case PROVIDER_TYPE.IBMDADB2 :
  95. if (String.Empty.Equals(port)) {
  96. string location = ConnectionStringHelper.FindValue(UserParameters,StringManager.GetStringArray("DB2_CON_LOCATION"));
  97. if (!String.Empty.Equals(location)) {
  98. int semicolumnIndex = location.IndexOf(':');
  99. if (semicolumnIndex != -1) {
  100. return location.Substring(semicolumnIndex + 1);
  101. }
  102. }
  103. return StringManager.GetString("DB2_CON_PORT");
  104. }
  105. return port;
  106. }
  107. return base.Port;
  108. }
  109. }
  110. protected override string JdbcDriverName
  111. {
  112. get {
  113. JDBC_MODE jdbcMode = JdbcMode;
  114. switch (jdbcMode) {
  115. case JDBC_MODE.DATA_SOURCE_MODE :
  116. return base.JdbcDriverName;
  117. case JDBC_MODE.JDBC_DRIVER_MODE :
  118. return ConnectionStringHelper.FindValue(UserParameters,StringManager.GetStringArray("JDBC_DRIVER"));
  119. case JDBC_MODE.PROVIDER_MODE:
  120. switch (ProviderType) {
  121. case PROVIDER_TYPE.SQLOLEDB :
  122. return StringManager.GetString("SQL_JDBC_DRIVER");
  123. case PROVIDER_TYPE.MSDAORA :
  124. return StringManager.GetString("ORA_JDBC_DRIVER");
  125. case PROVIDER_TYPE.IBMDADB2 :
  126. return StringManager.GetString("DB2_JDBC_DRIVER");
  127. }
  128. break;
  129. };
  130. return base.JdbcDriverName;
  131. }
  132. }
  133. protected override DbStringManager StringManager
  134. {
  135. get { return _stringManager; }
  136. }
  137. #endregion // Properties
  138. #region Methods
  139. public new OleDbTransaction BeginTransaction(IsolationLevel level)
  140. {
  141. return new OleDbTransaction(level, this);
  142. }
  143. public new OleDbTransaction BeginTransaction()
  144. {
  145. return BeginTransaction(IsolationLevel.ReadCommitted);
  146. }
  147. public new OleDbCommand CreateCommand()
  148. {
  149. return new OleDbCommand(this);
  150. }
  151. protected override DbTransaction BeginDbTransaction(IsolationLevel isolationLevel) {
  152. return BeginTransaction();
  153. }
  154. protected override DbCommand CreateDbCommand() {
  155. return CreateCommand();
  156. }
  157. protected internal override void CopyTo(AbstractDBConnection target)
  158. {
  159. base.CopyTo(target);
  160. }
  161. public object Clone()
  162. {
  163. OleDbConnection clone = new OleDbConnection();
  164. CopyTo(clone);
  165. return clone;
  166. }
  167. protected override SystemException CreateException(SQLException e)
  168. {
  169. return new OleDbException(e,this);
  170. }
  171. public DataTable GetOleDbSchemaTable (Guid schema, object[] restrictions)
  172. {
  173. DataTable schemaTable = new DataTable("Tables");
  174. schemaTable.Columns.Add("TABLE_CATALOG");
  175. schemaTable.Columns.Add("TABLE_SCHEMA");
  176. schemaTable.Columns.Add("TABLE_NAME");
  177. schemaTable.Columns.Add("TABLE_TYPE");
  178. schemaTable.Columns.Add("TABLE_GUID");
  179. schemaTable.Columns.Add("DESCRIPTION");
  180. schemaTable.Columns.Add("TABLE_PROPID");
  181. schemaTable.Columns.Add("DATE_CREATED");
  182. schemaTable.Columns.Add("DATE_MODIFIED");
  183. Connection con = JdbcConnection;
  184. String catalog = con.getCatalog();
  185. DatabaseMetaData meta = con.getMetaData();
  186. ResultSet schemaRes = meta.getSchemas();
  187. System.Collections.ArrayList schemas = new System.Collections.ArrayList();
  188. while(schemaRes.next()) {
  189. schemas.Add(schemaRes.getString(1));
  190. }
  191. schemaRes.close();
  192. for(int i = 0; i < schemas.Count; i++) {
  193. ResultSet tableRes = meta.getTables(catalog, schemas[i].ToString(), null, null);
  194. while(tableRes.next()) {
  195. DataRow row = schemaTable.NewRow();
  196. row["TABLE_CATALOG"] = catalog;
  197. row["TABLE_SCHEMA"] = schemas[i];
  198. row["TABLE_NAME"] = tableRes.getString("TABLE_NAME");
  199. row["TABLE_TYPE"] = tableRes.getString("TABLE_TYPE");
  200. row["DESCRIPTION"] = tableRes.getString("REMARKS");
  201. schemaTable.Rows.Add(row);
  202. }
  203. tableRes.close();
  204. }
  205. return schemaTable;
  206. }
  207. protected internal override void ValidateConnectionString(string connectionString)
  208. {
  209. base.ValidateConnectionString(connectionString);
  210. JDBC_MODE currentJdbcMode = JdbcMode;
  211. if (currentJdbcMode == JDBC_MODE.NONE) {
  212. string provider = StringManager.GetString("CON_PROVIDER");
  213. if (String.Empty.Equals(provider)) {
  214. throw ExceptionHelper.OleDbNoProviderSpecified();
  215. }
  216. }
  217. }
  218. protected override string BuildJdbcUrl()
  219. {
  220. switch (JdbcMode) {
  221. case JDBC_MODE.PROVIDER_MODE :
  222. switch (ProviderType) {
  223. case PROVIDER_TYPE.IBMDADB2:
  224. return BuildDb2Url();
  225. case PROVIDER_TYPE.MSDAORA:
  226. return BuildOracleUrl();
  227. case PROVIDER_TYPE.SQLOLEDB:
  228. return BuildMsSqlUrl();
  229. }
  230. break;
  231. }
  232. return base.BuildJdbcUrl();
  233. }
  234. public static void ReleaseObjectPool()
  235. {
  236. // since we're using connection pool from app servet, this is by design
  237. //throw new NotImplementedException();
  238. }
  239. internal override void OnSqlWarning(SQLWarning warning)
  240. {
  241. OleDbErrorCollection col = new OleDbErrorCollection(warning, this);
  242. OnOleDbInfoMessage(new OleDbInfoMessageEventArgs(col));
  243. }
  244. internal override Connection GetConnectionFromProvider()
  245. {
  246. if ((ProviderType == PROVIDER_TYPE.MSDAORA) &&
  247. ("true").Equals(StringManager.GetString("ORA_CONNECTION_POOLING_ENABLED","false"))) {
  248. ActivateJdbcDriver(JdbcDriverName);
  249. return OleDbConnectionFactory.GetConnection(ProviderType,JdbcUrl,User,Password,ConnectionTimeout);
  250. }
  251. else {
  252. return base.GetConnectionFromProvider();
  253. }
  254. }
  255. private String BuildDb2Url()
  256. {
  257. return StringManager.GetString("DB2_JDBC_URL") //jdbc:db2://
  258. + ServerName + ":" + Port + "/" + CatalogName;
  259. }
  260. private String BuildOracleUrl()
  261. {
  262. return StringManager.GetString("ORA_JDBC_URL") //"jdbc:oracle:thin:@"
  263. + ServerName + ":" + Port + ":" + CatalogName;
  264. }
  265. internal override void OnStateChanged(ConnectionState orig, ConnectionState current)
  266. {
  267. if(StateChange != null) {
  268. StateChange(this, new StateChangeEventArgs(orig, current));
  269. }
  270. }
  271. public override void Close()
  272. {
  273. ConnectionState orig = State;
  274. base.Close();
  275. ConnectionState current = State;
  276. if(current != orig) {
  277. OnStateChanged(orig, current);
  278. }
  279. }
  280. private void OnOleDbInfoMessage (OleDbInfoMessageEventArgs value)
  281. {
  282. if (InfoMessage != null) {
  283. InfoMessage (this, value);
  284. }
  285. }
  286. #endregion // Methods
  287. }
  288. }