davidl
Joined: 17 Aug 2006 Posts: 27
|
Posted: Tue Nov 28, 2006 4:49 am Post subject: play transactions with odbc |
|
|
add following methods to odbcdatabase.d in the odbcdatabase class
void BeginTrans()
{
if (!SQL_SUCCEEDED(SQLSetConnectAttr(connection, SQL_ATTR_AUTOCOMMIT, cast(SQLPOINTER)SQL_AUTOCOMMIT_OFF, SQL_IS_UINTEGER))){
throw new DBIException("Unable to begin trans ODBC returned");
}
}
void CommitTrans()
{
if (!SQL_SUCCEEDED(SQLEndTran(SQL_HANDLE_DBC, connection, SQL_COMMIT))) {
throw new DBIException("Unable to commit. ODBC returned " ~ getLastErrorMessage, "Transactions", getLastErrorCode);
}
if (!SQL_SUCCEEDED(SQLSetConnectAttr(connection, SQL_ATTR_AUTOCOMMIT, cast(SQLPOINTER)SQL_AUTOCOMMIT_ON, SQL_IS_UINTEGER))){
throw new DBIException("Unable to set attr back to auto after commit. ODBC returned");
}
}
void RollBack()
{
if (!SQL_SUCCEEDED(SQLEndTran(SQL_HANDLE_DBC, connection, SQL_ROLLBACK))) {
throw new DBIException("Unable to rollback after a query failure. ODBC returned " ~ getLastErrorMessage, "Transactions", getLastErrorCode);
}
if (!SQL_SUCCEEDED(SQLSetConnectAttr(connection, SQL_ATTR_AUTOCOMMIT, cast(SQLPOINTER)SQL_AUTOCOMMIT_ON, SQL_IS_UINTEGER))){
throw new DBIException("Unable to set attr back to auto after rollback. ODBC returned");
}
}
create a def file ( i don't know if it's odbc32.lib's mistake)
we need the SQLSetConnectAttr
myodbc32.lib
LIBRARY 'odbc32.DLL'
EXPORTS
_SQLSetConnectAttr@16 = SQLSetConnectAttr
then
implib.exe myodbc32.lib myodbc32.def
last step of using it
auto db= new OdbcDatabase();
db.connect("your connection string");
db.BeginTrans;
db.execute("your SQL");
db.CommitTrans;
if u want more than 1 transactions u need more than 1 connection. |
|