OdbcTransaction.cs 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  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. /// <summary>
  14. /// Summary description for OdbcTransaction.
  15. /// </summary>
  16. public class OdbcTransaction : MarshalByRefObject, IDbTransaction
  17. {
  18. private bool disposed = false;
  19. private OdbcConnection connection;
  20. private IsolationLevel isolationlevel;
  21. internal OdbcTransaction(OdbcConnection conn, IsolationLevel isolationlevel)
  22. {
  23. // Set Auto-commit (102) to false
  24. OdbcReturn ret=libodbc.SQLSetConnectAttr(conn.hDbc, OdbcConnectionAttribute.AutoCommit, IntPtr.Zero, 0);
  25. if ((ret!=OdbcReturn.Success) && (ret!=OdbcReturn.SuccessWithInfo))
  26. throw new OdbcException(new OdbcError("SQLSetConnectAttr",OdbcHandleType.Dbc,conn.hDbc));
  27. // Handle isolation level
  28. int lev=0;
  29. switch (isolationlevel)
  30. {
  31. case IsolationLevel.ReadUncommitted:
  32. lev=1;
  33. break;
  34. case IsolationLevel.ReadCommitted:
  35. lev=2;
  36. break;
  37. case IsolationLevel.RepeatableRead:
  38. lev=3;
  39. break;
  40. case IsolationLevel.Serializable:
  41. lev=4;
  42. break;
  43. case IsolationLevel.Unspecified:
  44. lev=0;
  45. break;
  46. default:
  47. throw new NotSupportedException();
  48. }
  49. libodbc.SQLSetConnectAttr(conn.hDbc, OdbcConnectionAttribute.TransactionIsolation, (IntPtr) lev, 0);
  50. if ((ret!=OdbcReturn.Success) && (ret!=OdbcReturn.SuccessWithInfo))
  51. throw new OdbcException(new OdbcError("SQLSetConnectAttr",OdbcHandleType.Dbc,conn.hDbc));
  52. this.isolationlevel=isolationlevel;
  53. connection=conn;
  54. }
  55. public void Commit()
  56. {
  57. if (connection.transaction==this)
  58. {
  59. OdbcReturn ret=libodbc.SQLEndTran((short) OdbcHandleType.Dbc, connection.hDbc, 0);
  60. if ((ret!=OdbcReturn.Success) && (ret!=OdbcReturn.SuccessWithInfo))
  61. throw new OdbcException(new OdbcError("SQLEndTran",OdbcHandleType.Dbc,connection.hDbc));
  62. connection.transaction=null;
  63. }
  64. else
  65. throw new InvalidOperationException();
  66. }
  67. public void Rollback()
  68. {
  69. if (connection.transaction==this)
  70. {
  71. OdbcReturn ret=libodbc.SQLEndTran((short) OdbcHandleType.Dbc, connection.hDbc, 1);
  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 IDbConnection Connection
  80. {
  81. get {
  82. return connection;
  83. }
  84. }
  85. public IsolationLevel IsolationLevel
  86. {
  87. get {
  88. return isolationlevel;
  89. }
  90. }
  91. private void Dispose (bool disposing)
  92. {
  93. if (!disposed) {
  94. if (disposing) {
  95. Rollback ();
  96. }
  97. disposed = true;
  98. }
  99. }
  100. public void Dispose ()
  101. {
  102. Dispose (true);
  103. GC.SuppressFinalize (this);
  104. }
  105. }
  106. }