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 😋


Anmelden zum Antworten