prepareStatement und setString



  • Ich habe folgenden Problem. Wenn ich über prepareSatement die setString Methode aufrufe und einen String als Variable übergebe kommen komische Werte in der MySQL datenbank an. Wenn ich den String in die Funktion schreibe mit Gänsefüßchen wird der Wert korrekt eingetragen in die DB. Ich möchte den PrepareStatement benutzen da noch mehr Werte als Name in die DB eingetragen werden sollen.

    Siehe Code.
    Jemand eine idee woran das liegen könnte?

    Funktioniert: In DB steht "Hallo"

    pstmt = con->prepareStatement("INSERT INTO HIGHSCORE_SPACEINVADERS (NAME) VALUES (?)");
    
    		//string name = "Hallo";
    
    		pstmt->setString(1, "Hallo");			
    		pstmt->executeUpdate();
    

    Funktioniert nicht: In DB steht unter Name: "o   ?  "

    pstmt = con->prepareStatement("INSERT INTO HIGHSCORE_SPACEINVADERS (NAME) VALUES (?)");
    
    		string name = "Hallo";
    
    		pstmt->setString(1, name);			
    		pstmt->executeUpdate();
    

    setInt() methode funktioniert fehlerfrei. Nur bei setString taucht der fehler auf.



  • Das sieht aus als hättest du uns wichtigen Code verschwiegen, wenn das tatsächlich der einzige Unterschied sein sollte dürfte das so nicht vorkommen.

    In welcher Programmiersprache bist du denn? Kann es sein, dass string nicht gleich wie ein String-Literal behandelt wird?

    MfG SideWinder



  • Hier der gesamte Code

    int main(int argc, const char **argv)
    {	
    
        cout << "C++ MySQl Connector" << endl;
        cout << endl;
    
    	if(sendScore("Andreas", 20, 0 ,156))
    		cout << "Sending new Score was Successfull!";
    	else
    		cout << "Error on sending new Score !";
    
        cout << "Done." << endl;
    	cin.get();
        return EXIT_SUCCESS;
    }
    
    bool sendScore(string name, int score, int datetime, int playtime){
    
    	sql::Driver *driver;
    	sql::Connection *con;
    	sql::Statement *stmt;
    	sql::ResultSet *res;
    	sql::PreparedStatement *pstmt;
    
    	string query;
    
    	try{
    		//Establish connection to MySQL Server 
    		driver = get_driver_instance();
    		con = driver->connect("*****", "*****", "******");
    
    		//Select gameScopeSQL Database on Server
    		con->setSchema("gameScopeSQL");		
    
    		//Prepare and Execute Insert Query to transfer new Score
    		pstmt = con->prepareStatement("INSERT INTO HIGHSCORE_SPACEINVADERS (NAME, SCORE, DATETIME, PLAYTIME) VALUES (?,?,?,?)");
    
    		pstmt->setString(1, name);			
    		pstmt->setInt(2, score);
    		pstmt->setInt(3, datetime);
    		pstmt->setInt(4, playtime);
    		pstmt->executeUpdate();
    
    		delete pstmt;
    
    	}
    	catch (sql::SQLException &e) {
            /*
              The MySQL Connector/C++ throws three different exceptions:
    
              - sql::MethodNotImplementedException (derived from sql::SQLException)
              - sql::InvalidArgumentException (derived from sql::SQLException)
              - sql::SQLException (derived from std::runtime_error)
            */
            cout << "# ERR: SQLException in " << __FILE__;
            cout << "(" << __FUNCTION__ << ") on line " << __LINE__ << endl;
            /* Use what() (derived from std::runtime_error) to fetch the error message */
            cout << "# ERR: " << e.what();
            cout << " (MySQL error code: " << e.getErrorCode();
            cout << ", SQLState: " << e.getSQLState() << " )" << endl;
    		cin.get();
            return false;
        }
    
    	return true;
    }
    

    VisualStudio 2010
    c++



  • Ich kenn jetzt die Dokumentation von setString() nicht und ob die wirklich eine geeignete Überladung für std::string hat, aber probier mal name.c_str()

    MfG SideWinder



  • Tada!!!
    Es funktioniert!

    Danke.

    durch name.c_str() wird der String in eine C String umgewandlt und dieser wird von der MySql Methode setString() akzeptiert?



  • Offenbar, ich kenne leider die Dokumentation von setString() nicht, aber ich befürchte fast, dass std::string nicht so behandelt wird wie von dir gewünscht.

    Aber ja, .c_str() liefer dir einen const char* als Typ zurück, welcher dann gleich dem Typ des String-Literals "Hallo" ist.

    MfG SideWinder



  • Seltsamerweise gibt es (zumindest in der aktuellen Version) von setString nur eine einzige Überladung, die einen sql::SQLString const& entegegennimmt. Dieser wiederum hat zwei Konstruktoren, einen mit char const* (der den internen std::string mit diesem initialisiert) und einen mit std::string const& (der diesen in den internen std::string kopiert).

    Eigentlich sollten also beide Varianten identisch sein, es seidenn Du verwendest eine alte Version des Connectors, der sich in dieser Hinsicht gravierend unterscheidet.



  • ich nutze den mysql-connector-1.1.1-win32
    somit den neusten.



  • Welche Includes verwendest du?


Anmelden zum Antworten