OdbcTransaction.cs 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. //
  2. // System.Data.Odbc.OdbcTransaction
  3. //
  4. // Authors:
  5. // Brian Ritchie ([email protected])
  6. //
  7. // Copyright (C) Brian Ritchie, 2002
  8. //
  9. using System;
  10. using System.Data;
  11. namespace System.Data.Odbc
  12. {
  13. public sealed class OdbcTransaction : MarshalByRefObject, IDbTransaction
  14. {
  15. private bool disposed = false;
  16. private OdbcConnection connection;
  17. private IsolationLevel isolationlevel;
  18. internal OdbcTransaction(OdbcConnection conn, IsolationLevel isolationlevel)
  19. {
  20. // Set Auto-commit (102) to false
  21. OdbcReturn ret=libodbc.SQLSetConnectAttr(conn.hDbc, OdbcConnectionAttribute.AutoCommit, IntPtr.Zero, 0);
  22. if ((ret!=OdbcReturn.Success) && (ret!=OdbcReturn.SuccessWithInfo))
  23. throw new OdbcException(new OdbcError("SQLSetConnectAttr",OdbcHandleType.Dbc,conn.hDbc));
  24. // Handle isolation level
  25. int lev=0;
  26. switch (isolationlevel)
  27. {
  28. case IsolationLevel.ReadUncommitted:
  29. lev=1;
  30. break;
  31. case IsolationLevel.ReadCommitted:
  32. lev=2;
  33. break;
  34. case IsolationLevel.RepeatableRead:
  35. lev=3;
  36. break;
  37. case IsolationLevel.Serializable:
  38. lev=4;
  39. break;
  40. case IsolationLevel.Unspecified:
  41. lev=0;
  42. break;
  43. default:
  44. throw new NotSupportedException();
  45. }
  46. libodbc.SQLSetConnectAttr(conn.hDbc, OdbcConnectionAttribute.TransactionIsolation, (IntPtr) lev, 0);
  47. if ((ret!=OdbcReturn.Success) && (ret!=OdbcReturn.SuccessWithInfo))
  48. throw new OdbcException(new OdbcError("SQLSetConnectAttr",OdbcHandleType.Dbc,conn.hDbc));
  49. this.isolationlevel=isolationlevel;
  50. connection=conn;
  51. }
  52. #region Implementation of IDisposable
  53. private void Dispose(bool disposing) {
  54. if (!disposed) {
  55. if (disposing) {
  56. Rollback();
  57. }
  58. disposed = true;
  59. }
  60. }
  61. void IDisposable.Dispose() {
  62. Dispose(true);
  63. GC.SuppressFinalize(this);
  64. }
  65. #endregion Implementation of IDisposable
  66. #region Implementation of IDbTransaction
  67. public void Commit()
  68. {
  69. if (connection.transaction==this)
  70. {
  71. OdbcReturn ret=libodbc.SQLEndTran((short) OdbcHandleType.Dbc, connection.hDbc, 0);
  72. if ((ret!=OdbcReturn.Success) && (ret!=OdbcReturn.SuccessWithInfo))
  73. throw new OdbcException(new OdbcError("SQLEndTran",OdbcHandleType.Dbc,connection.hDbc));
  74. connection.transaction=null;
  75. }
  76. else
  77. throw new InvalidOperationException();
  78. }
  79. public void Rollback()
  80. {
  81. if (connection.transaction==this)
  82. {
  83. OdbcReturn ret=libodbc.SQLEndTran((short) OdbcHandleType.Dbc, connection.hDbc, 1);
  84. if ((ret!=OdbcReturn.Success) && (ret!=OdbcReturn.SuccessWithInfo))
  85. throw new OdbcException(new OdbcError("SQLEndTran",OdbcHandleType.Dbc,connection.hDbc));
  86. connection.transaction=null;
  87. }
  88. else
  89. throw new InvalidOperationException();
  90. }
  91. IDbConnection IDbTransaction.Connection
  92. {
  93. get
  94. {
  95. return Connection;
  96. }
  97. }
  98. public IsolationLevel IsolationLevel
  99. {
  100. get
  101. {
  102. return isolationlevel;
  103. }
  104. }
  105. #endregion Implementation of IDbTransaction
  106. #region Public Instance Properties
  107. public OdbcConnection Connection
  108. {
  109. get
  110. {
  111. return connection;
  112. }
  113. }
  114. #endregion Public Instance Properties
  115. }
  116. }