代码之家  ›  专栏  ›  技术社区  ›  Ryan

MySQL/C++和准备语句:SETIN总是0

  •  2
  • Ryan  · 技术社区  · 16 年前

    我使用MySQL连接器/C++库将值插入到数据库表中。我在下面的例子中

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

    几乎完全正确。但是,我似乎无法让准备好的语句与值占位符一起工作。

      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.
      }
    

    有什么关于我为什么不能遵守准备好的声明的想法吗?其他set*函数具有相同的结果(例如,如果使用set string,则在结果行中得到一个字符串“0”)。

    2 回复  |  直到 16 年前
        1
  •  1
  •   Charles Salvia    16 年前

    我有一段时间没有做SQL了,但是我想你忘了把列名放在那里了。语法应为:

    INSERT INTO TESTTBL (column_name) VALUES (?)
    

    如果要插入多个列,可以使用逗号分隔符:

    INSERT INTO TESTTBL (col1, col2, col3) VALUES (?,?,?)
    
        2
  •  1
  •   Ryan    16 年前

    从源代码中重新编译C++连接器修复了这个问题。

    可能是他们预先构建的二进制文件中的编译器设置不符合我的项目。我会和MySQL讨论这个问题。

    谢谢你的帮助。