OdbcConnection.cs 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250
  1. //
  2. // System.Data.Odbc.OdbcConnection
  3. //
  4. // Authors:
  5. // Brian Ritchie ([email protected])
  6. //
  7. // Copyright (C) Brian Ritchie, 2002
  8. //
  9. using System.ComponentModel;
  10. using System.Data;
  11. using System.Data.Common;
  12. namespace System.Data.Odbc
  13. {
  14. public sealed class OdbcConnection : Component, ICloneable, IDbConnection
  15. {
  16. #region Fields
  17. string connectionString;
  18. int connectionTimeout;
  19. OdbcDataReader dataReader;
  20. int henv=0, hdbc=0;
  21. private string _uid, _pwd, _dsn;
  22. #endregion
  23. #region Constructors
  24. public OdbcConnection ()
  25. {
  26. OdbcReturn ret;
  27. // allocate Environment handle
  28. ret=libodbc.SQLAllocHandle((ushort) OdbcHandleType.Env, 0, ref henv);
  29. libodbc.DisplayError("SQLAllocHandle", ret);
  30. ret=libodbc.SQLSetEnvAttr(henv, (ushort) OdbcEnv.OdbcVersion, (IntPtr) 3
  31. , 0);
  32. libodbc.DisplayError("SQLSetEnvAttr", ret);
  33. Console.WriteLine("ODBCInit Complete.");
  34. connectionTimeout = 15;
  35. connectionString = null;
  36. dataReader = null;
  37. }
  38. public OdbcConnection (string connectionString) : this ()
  39. {
  40. ConnectionString = connectionString;
  41. }
  42. #endregion // Constructors
  43. #region Properties
  44. public int hDbc
  45. {
  46. get { return hdbc; }
  47. }
  48. public string ConnectionString {
  49. get {
  50. return connectionString;
  51. }
  52. set {
  53. connectionString = value;
  54. string[] items=connectionString.Split(new char[1]{';'});
  55. foreach (string item in items)
  56. {
  57. string[] parts=item.Split(new char[1] {'='});
  58. switch (parts[0].Trim().ToLower())
  59. {
  60. case "dsn":
  61. _dsn=parts[1].Trim();
  62. break;
  63. case "uid":
  64. _uid=parts[1].Trim();
  65. break;
  66. case "pwd":
  67. _pwd=parts[1].Trim();
  68. break;
  69. }
  70. }
  71. }
  72. }
  73. public int ConnectionTimeout {
  74. get {
  75. return connectionTimeout;
  76. }
  77. }
  78. public string DataSource {
  79. get {
  80. if (State==ConnectionState.Open)
  81. return _dsn;
  82. else
  83. return null;
  84. }
  85. }
  86. public string Database {
  87. get {
  88. return "";
  89. }
  90. }
  91. public ConnectionState State
  92. {
  93. get {
  94. if (hdbc!=0) {
  95. return ConnectionState.Open;
  96. }
  97. else
  98. return ConnectionState.Closed;
  99. }
  100. }
  101. internal OdbcDataReader DataReader
  102. {
  103. get {
  104. return dataReader;
  105. }
  106. set {
  107. dataReader = value;
  108. }
  109. }
  110. #endregion // Properties
  111. #region Methods
  112. public void BeginTransaction()
  113. {
  114. OdbcReturn ret;
  115. // Set Auto-commit to false
  116. ret=libodbc.SQLSetConnectAttr(hdbc, 102, 0, 0);
  117. libodbc.DisplayError("SQLSetConnectAttr(NoAutoCommit)", ret);
  118. }
  119. public void CommitTransaction()
  120. {
  121. OdbcReturn ret;
  122. ret=libodbc.SQLEndTran((short) OdbcHandleType.Dbc, hdbc, 0);
  123. libodbc.DisplayError("SQLEndTran(commit)", ret);
  124. }
  125. public void RollbackTransaction()
  126. {
  127. OdbcReturn ret;
  128. ret=libodbc.SQLEndTran((short) OdbcHandleType.Dbc, hdbc, 1);
  129. libodbc.DisplayError("SQLEndTran(rollback)", ret);
  130. }
  131. // public OdbcTransaction BeginTransaction ()
  132. // {
  133. // }
  134. IDbTransaction IDbConnection.BeginTransaction ()
  135. {
  136. throw new NotImplementedException ();
  137. // return BeginTransaction ();
  138. }
  139. // public OdbcTransaction BeginTransaction (IsolationLevel level)
  140. // {
  141. //
  142. // }
  143. IDbTransaction IDbConnection.BeginTransaction (IsolationLevel level)
  144. {
  145. throw new NotImplementedException ();
  146. // return BeginTransaction (level);
  147. }
  148. public void Close ()
  149. {
  150. if (State == ConnectionState.Open) {
  151. hdbc = 0;
  152. }
  153. dataReader = null;
  154. }
  155. public OdbcCommand CreateCommand ()
  156. {
  157. throw new NotImplementedException ();
  158. }
  159. [MonoTODO]
  160. public void ChangeDatabase(string Database)
  161. {
  162. throw new NotImplementedException ();
  163. }
  164. [MonoTODO]
  165. protected override void Dispose (bool disposing)
  166. {
  167. throw new NotImplementedException ();
  168. }
  169. [MonoTODO]
  170. object ICloneable.Clone ()
  171. {
  172. throw new NotImplementedException();
  173. }
  174. IDbCommand IDbConnection.CreateCommand ()
  175. {
  176. throw new NotImplementedException();
  177. // return CreateCommand ();
  178. }
  179. public void Open ()
  180. {
  181. if (State == ConnectionState.Open)
  182. throw new InvalidOperationException ();
  183. OdbcReturn ret;
  184. // allocate connection handle
  185. ret=libodbc.SQLAllocHandle((ushort) OdbcHandleType.Dbc, henv, ref hdbc);
  186. libodbc.DisplayError("SQLAllocHandle(hdbc)", ret);
  187. // Connect to data source
  188. ret=libodbc.SQLConnect(hdbc, _dsn, -3, _uid, -3, _pwd, -3);
  189. libodbc.DisplayError("SQLConnect",ret);
  190. }
  191. [MonoTODO]
  192. public static void ReleaseObjectPool ()
  193. {
  194. throw new NotImplementedException ();
  195. }
  196. #endregion
  197. #region Events and Delegates
  198. public event StateChangeEventHandler StateChange;
  199. #endregion
  200. }
  201. }