2009-11-10 4 views
2

J'utilise la bibliothèque MySQL Connector/C++ pour insérer des valeurs dans une table de base de données. Je suis les exemples àInstructions MySQL/C++ et Prepared: setInt always 0

http://dev.mysql.com/tech-resources/articles/mysql-connector-cpp.html

presque exactement. Cependant, je ne peux pas sembler obtenir des déclarations préparées pour travailler avec des espaces réservés de valeur.

sql::mysql::MySQL_Driver* driver = sql::mysql::MySQL_Driver::Instance(); 

    boost::shared_ptr<sql::Connection> conn(driver->connect("localhost", "", "")); 
    conn->setSchema("TESTDB"); 

    boost::shared_ptr<sql::Statement> stmt(conn->createStatement()); 
    stmt->execute("DROP TABLE IF EXISTS TESTTBL"); 
    stmt->execute("CREATE TABLE TESTTBL (m_id INT)"); 

    boost::shared_ptr<sql::PreparedStatement> pstmt(conn->prepareStatement("INSERT INTO TESTTBL VALUES(?)")); 
    for (int i = 0; i != 10; ++i) { 
    pstmt->setInt(1, i); 
    pstmt->executeUpdate();  // Always inserts 0. 
    } 

Des idées sur les raisons pour lesquelles je ne peux pas me lier à l'instruction préparée? Les autres fonctions set * ont le même résultat (par exemple, si j'utilise setString, j'obtiens une chaîne '0' dans la ligne résultante).

+0

Lorsque vous dites "insère toujours 0", voulez-vous dire que vous avez dix lignes de zéro dans la base de données? –

+0

Oui, je reçois 10 lignes de zéro, peu importe ce que je passe à setInt(). Si je code en dur un nombre au lieu de '?' tout est bon. – Ryan

Répondre

1

recompilation le connecteur C++ de la source fixe ce problème.

Probablement un paramètre du compilateur dans leur binaire pré-construit qui n'était pas en accord avec mon projet. Je vais parler à MySQL à ce sujet.

Merci pour l'aide.

1

Je n'ai pas fait SQL depuis un moment, mais je pense que vous oubliez d'y mettre le nom de la colonne. La syntaxe doit être:

INSERT INTO TESTTBL (column_name) VALUES (?) 

Si vous voulez insérer dans plusieurs colonnes, vous utiliseriez délimiteurs par des virgules:

INSERT INTO TESTTBL (col1, col2, col3) VALUES (?,?,?) 
+0

Ce n'est pas un problème de syntaxe. Hardcoding un nombre entier à la place du? puis en sautant l'appel à setInt fonctionne très bien. – Ryan

Questions connexes