MySQL/C++ и подготовленные операторы: setInt всегда 0

Я использую библиотеку MySQL Connector/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* имеют тот же результат (например, если я использую setString, я получаю строку '0' в результирующей строке).


person Ryan    schedule 10.11.2009    source источник
comment
Когда вы говорите, что он всегда вставляет 0, вы имеете в виду, что получаете десять нулевых строк в базе данных?   -  person Jim Garrison    schedule 10.11.2009
comment
Да, я получаю 10 нулевых строк, независимо от того, что я передаю в setInt(). Если я жестко запрограммирую число вместо '?' все в порядке.   -  person Ryan    schedule 11.11.2009


Ответы (2)


Я давно не занимался SQL, но думаю, вы забыли указать там имя столбца. Синтаксис должен быть:

INSERT INTO TESTTBL (column_name) VALUES (?)

Если вы хотите вставить в несколько столбцов, вы должны использовать разделители-запятые:

INSERT INTO TESTTBL (col1, col2, col3) VALUES (?,?,?)
person Charles Salvia    schedule 10.11.2009
comment
Это не проблема синтаксиса. Жесткое кодирование целого числа вместо ? а затем пропустить вызов setInt работает нормально. - person Ryan; 10.11.2009

Перекомпиляция соединителя C++ из исходного кода устранила эту проблему.

Вероятно, настройка компилятора в их предварительно собранном двоичном файле не согласовывалась с моим проектом. Я поговорю с MySQL об этом.

Спасибо за помощь.

person Ryan    schedule 11.11.2009