Problem mit Autocommit in C++ Progamm bei MySQL DB [solved]
-
Hallo Forum,
ich schreibe gerade ein C++ Programm das Daten in eine MySQL DB speichert.
Ich habe hierzu diese Klasse geschrieben:#ifndef CDATENBANK_H_ #define CDATENBANK_H_ #include <string> #include <iostream> #include <iomanip> #include <mysql++.h> #include "Tabelle.h" using namespace std; //using namespace mysqlpp; class CDatenbank { private: string strUserName; string strPassword; string strServer; string strDatenbank; mysqlpp::Connection conn; mysqlpp::Query query; mysqlpp::StoreQueryResult res; mysqlpp::Transaction *trans; bool flgConnected; public: CDatenbank(); bool connect(const string &Server, const string &Datenbank, const string &Benutzer, const string &Passwort); bool executeSQLquery(const string &sql); bool executeSQL(const string &sql); void createTable(string tblName, FELDER felder[], int intAnzahlFelder); void deleteTable(string tblName); void insert(string strTblName, FELDER felder[], int intAnzahlFelder, string strInhalt[]); void disconnect(); bool isConnected(); void commit(); void rollback(); ~CDatenbank(); }; #endif /*CDATENBANK_H_*/
#include "CDatenbank.h" CDatenbank::CDatenbank(): query(false), conn(false) { //conn = new mysqlpp::Connection(false); flgConnected = false; } bool CDatenbank::connect(const string &Server, const string &Datenbank, const string &Benutzer, const string &Passwort) { strServer = Server; strDatenbank = Datenbank; strUserName = Benutzer; strPassword = Passwort; if( conn.connect( strDatenbank.c_str(), strServer.c_str(), strUserName.c_str(), strPassword.c_str()) ) { flgConnected = true; query = conn.query(); trans = new mysqlpp::Transaction(conn); executeSQL("SET AUTOCOMMIT=OFF"); return true; } else { throw("Fehler beim verbinden zu DB" + Datenbank);; return false; } } bool CDatenbank::executeSQLquery(const string &sql) { cout << "execute SQL " << sql << endl; query = conn.query(sql.c_str()); res = query.store(); if (res) return true; else { cerr << "Fehler beim ausfuehren von:" << endl << sql << endl << query.error() << endl; return false; } } bool CDatenbank::executeSQL(const string &sql) { query.execute(sql); string strErr = query.error(); if (strErr.length() > 1) { cerr << ">>" << query.error() << "<<" << endl; throw strErr; return false; } return true; } void CDatenbank::commit() { trans->commit(); } void CDatenbank::rollback() { trans->rollback(); } void CDatenbank::createTable(string strTblName, FELDER felder[], int intAnzahlFelder) { int intPK = -1; string strSql = "CREATE TABLE `" + strDatenbank + "`.`" + strTblName + "`" + " (\n"; for(int intI=0; intI < intAnzahlFelder; intI++) { strSql += "\t`" + felder[intI].strName + "` "; strSql += felder[intI].strTyp + " "; strSql += "( " + felder[intI].strLaenge + " ) "; if (felder[intI].flgNullable) strSql += "NULL "; else strSql += "NOT NULL "; if (felder[intI].flgPK) strSql += "AUTO_INCREMENT PRIMARY KEY "; if ( intI < intAnzahlFelder -1 ) strSql += ",\n"; } strSql += "\n)"; strSql += " ENGINE = MYISAM;"; try { executeSQL(strSql); } catch (string c) { throw c; } } void CDatenbank::deleteTable(string tblName) { try { executeSQL("DROP TABLE `" + tblName + "`"); } catch (string c) { throw c; } } void CDatenbank::insert(string strTblName, FELDER felder[], int intAnzahlFelder, string strInhalt[]) { string strSql = "INSERT INTO `" + strDatenbank + "`.`" + strTblName + "`" + " (\n"; for (int intI = 0; intI<intAnzahlFelder; intI++) { if (! felder[intI].flgPK) { strSql += "`" + felder[intI].strName + "`"; if ( intI < intAnzahlFelder -1) strSql += ", "; } } strSql += ")\nVALUES ( "; for (int intI = 0; intI < intAnzahlFelder; intI++) { if (! felder[intI].flgPK) { if (felder[intI].strTyp == "VARCHAR") strSql += "'"; strSql += strInhalt[intI]; if (felder[intI].strTyp == "VARCHAR") strSql += "'"; if ( intI < intAnzahlFelder -1) strSql += ", "; } } strSql += ");"; try { executeSQL(strSql); } catch (string c) { throw c; } } void CDatenbank::disconnect() { if (flgConnected) { /* close connection */ conn.disconnect(); delete trans; flgConnected = false; } } bool CDatenbank::isConnected() { return flgConnected; } CDatenbank::~CDatenbank() { disconnect(); flgConnected = false; }
Nun zu meinem Problem:
Alle "INSERT" Befehle die ich durch die Funktion "CDatenbank::insert" absetzte werden sofort in die DB geschrieben. Es muss also Autocommit an sein. Ich verstehe nicht warum?
Hat jemand ne Idee??
-
Lies' Dir mal die Doku zu den mysql-Storage Engines durch:
http://dev.mysql.com/doc/refman/5.1/en/storage-engines.html
Dann wirst Du feststellen dass myIsam gar keine Transaktionen unterstützt.
-
Hi witte,
vielen Dank für deinen Tipp.
Ich verwende jetzt die Engine INNODB und alles funktioniert wunderbar