2016-02-10 2 views
0

Как можно использовать транзакции вручную или с обратной транзакцией с использованием API ODBC Microsoft Windows? Запрошенный SQL-сервер - это MS SQL Server, если это имеет значение. Язык - это C++.Как выполнять ручные транзакции с Windows ODBC

Мне нужно включить несколько звонков в SQLExecDirect в одну транзакцию, чтобы гарантировать согласованность. Выполненные запросы не используют транзакции.

псевдокод:

// Begin Transaction? 
SQLExecDirect(...); 
SQLExecDirect(...); 
SQLExecDirect(...); 
SQLExecDirect(...); 
SQLExecDirect(...); 
SQLEndTran(...); 

Мой подход был отключить AutoCommit первым как описано на TechNet:

SQLSetConnectAttr(m_hConnection, SQL_ATTR_AUTOCOMMIT, (void*) SQL_AUTOCOMMIT_OFF, 0); 

Выполнить мои запросы, а затем совершить/откат после:

SQLEndTran(SQL_HANDLE_DBC, m_hConnection, SQL_COMMIT); 

It не дает никаких ошибок, но, похоже, не делает этого. Если я проверю журнал транзакций с помощью MS SQL Management Studio, все будет отображаться как implicit_transaction (Okay), охватывая только одну операцию (Not Okay).

SSMS Output

Может ли эта проблема быть вызвана каждым вызовом SQLExecDirect, используя его собственное заявление обращаться? Я думал об этом, и я мог бы попытаться изменить это, но это была бы довольно сложная задача, которую я не желаю делать только потому, что это может быть.

С другой стороны, я понятия не имею, как отлаживать дальше. Если бы у кого-то были какие-то идеи, я бы очень признателен.

ответ

1

Это очень похоже на то, что я обычно делаю. Несколько различий в SQLSetConnectAttr:

  1. я проверить возвращаемое значение
  2. SQL_AUTOCOMMIT_OFF должны быть преобразованы в SQLPOINTER
  3. последнего параметра должна быть SQL_IS_UINTEGER, а не 0

Все остальное кажется нормально для меня. ..

+0

Я пропустил проверку возвращаемого значения в своем сообщении, конечно, я делаю это. Нет ошибки. Это SQL_SUCCESS. Попробуй попробовать другое дело, спасибо. SQL_IS_UINTEGER может быть ключом, поскольку его значение равно -5 не 0. – antipattern

+0

Так оно и было. Благодаря! – antipattern