OdbcTransaction.cs 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  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
  17. {
  18. private OdbcConnection connection;
  19. private IsolationLevel isolationlevel;
  20. internal OdbcTransaction(OdbcConnection conn, IsolationLevel isolationlevel)
  21. {
  22. // Set Auto-commit (102) to false
  23. OdbcReturn ret=libodbc.SQLSetConnectAttr(conn.hDbc, OdbcConnectionAttribute.AutoCommit, IntPtr.Zero, 0);
  24. if ((ret!=OdbcReturn.Success) && (ret!=OdbcReturn.SuccessWithInfo))
  25. throw new OdbcException(new OdbcError("SQLSetConnectAttr",OdbcHandleType.Dbc,conn.hDbc));
  26. // Handle isolation level
  27. int lev=0;
  28. switch (isolationlevel)
  29. {
  30. case IsolationLevel.ReadUncommitted:
  31. lev=1;
  32. break;
  33. case IsolationLevel.ReadCommitted:
  34. lev=2;
  35. break;
  36. case IsolationLevel.RepeatableRead:
  37. lev=3;
  38. break;
  39. case IsolationLevel.Serializable:
  40. lev=4;
  41. break;
  42. case IsolationLevel.Unspecified:
  43. lev=0;
  44. break;
  45. default:
  46. throw new NotSupportedException();
  47. }
  48. libodbc.SQLSetConnectAttr(conn.hDbc, OdbcConnectionAttribute.TransactionIsolation, (IntPtr) lev, 0);
  49. if ((ret!=OdbcReturn.Success) && (ret!=OdbcReturn.SuccessWithInfo))
  50. throw new OdbcException(new OdbcError("SQLSetConnectAttr",OdbcHandleType.Dbc,conn.hDbc));
  51. this.isolationlevel=isolationlevel;
  52. connection=conn;
  53. }
  54. public void Commit()
  55. {
  56. if (connection.transaction==this)
  57. {
  58. OdbcReturn ret=libodbc.SQLEndTran((short) OdbcHandleType.Dbc, connection.hDbc, 0);
  59. if ((ret!=OdbcReturn.Success) && (ret!=OdbcReturn.SuccessWithInfo))
  60. throw new OdbcException(new OdbcError("SQLEndTran",OdbcHandleType.Dbc,connection.hDbc));
  61. connection.transaction=null;
  62. }
  63. else
  64. throw new InvalidOperationException();
  65. }
  66. public void Rollback()
  67. {
  68. if (connection.transaction==this)
  69. {
  70. OdbcReturn ret=libodbc.SQLEndTran((short) OdbcHandleType.Dbc, connection.hDbc, 1);
  71. if ((ret!=OdbcReturn.Success) && (ret!=OdbcReturn.SuccessWithInfo))
  72. throw new OdbcException(new OdbcError("SQLEndTran",OdbcHandleType.Dbc,connection.hDbc));
  73. connection.transaction=null;
  74. }
  75. else
  76. throw new InvalidOperationException();
  77. }
  78. }
  79. }