diff options
Diffstat (limited to 'libodbcpp/odbc-modifycommand.cpp')
-rw-r--r-- | libodbcpp/odbc-modifycommand.cpp | 40 |
1 files changed, 40 insertions, 0 deletions
diff --git a/libodbcpp/odbc-modifycommand.cpp b/libodbcpp/odbc-modifycommand.cpp new file mode 100644 index 0000000..5d483c5 --- /dev/null +++ b/libodbcpp/odbc-modifycommand.cpp @@ -0,0 +1,40 @@ +#include "odbc-modifycommand.h" +#include "odbc-error.h" + +ODBC::ModifyCommand::ModifyCommand(const ODBC::Connection & c, const std::string & sql) : + DB::Command(sql), + ODBC::Command(c, sql), + DB::ModifyCommand(sql) +{ +} + +ODBC::ModifyCommand::~ModifyCommand() +{ +} + +unsigned int +ODBC::ModifyCommand::execute(bool anc) +{ + if (connection.txIsAborted()) { + throw Error("Transaction has been aborted, not issuing any more commands"); + } + RETCODE rc = SQLExecute(hStmt); + if (!SQL_SUCCEEDED(rc)) { + if (rc != SQL_NO_DATA || !anc) { + connection.abortTx(); + throw Error(rc, SQL_HANDLE_STMT, hStmt, "ODBC::ModifyCommand::execute SQLExecute"); + } + } + SQLLEN rows; + rc = SQLRowCount(hStmt, &rows); + if (!SQL_SUCCEEDED(rc)) { + connection.abortTx(); + throw Error(rc, SQL_HANDLE_STMT, hStmt, "ODBC::ModifyCommand::execute SQLRowCount"); + } + if (rows > 0 || anc) { + return rows; + } + connection.abortTx(); + throw Error("No rows affected"); +} + |