MySQL C ++ соединитель MySQL_Prepared_Statement :: getUpdateCount ошибка - PullRequest
2 голосов
/ 02 февраля 2012

Я использую коннектор MySQL C ++ версии 1.1.0. Вот как выглядит мой код:

PreparedStatement *pStatement;
connection->setAutoCommit(false);

pStatement = connection->prepareStatement("UPDATE records "
            "SET is_processed = ? "
            "WHERE id = ?");

    //LOOP BEGIN
    pStatement->setInt(1, is_processed);
    pStatement->setString(2, record_id);

    pStatement->execute();
    //LOOP END

int updated_records;

try 
{
    updated_records = pStatement->getUpdateCount();
}
catch(SQLException&e)
{
    cout << "ERROR: " << e.what();
    cout << " (MySQL error code: " << e.getErrorCode();
    cout << ", SQLState: " << e.getSQLState() << ")" << endl;
}

connection->commit();
connection->setAutoCommit(true);

Исключение выдается со следующим выводом:

ERROR: MySQL_Prepared_Statement::getUpdateCount (MySQL error code: 0, SQLState: )

Так что это совершенно ничего не говорит. Что не так с функцией getUpdateCount()? Есть ли способ получить более подробный отчет об ошибках?

EDIT

Есть ли другой способ получения обновленного числа строк с использованием коннектора mysql c ++?

Ответы [ 3 ]

2 голосов
/ 18 апреля 2017

Я тоже столкнулся с этой проблемой. В итоге я взглянул на исходный код. Похоже, что источник явно выдаст исключение.

uint64_t
MySQL_Prepared_Statement::getUpdateCount()
{
  checkClosed();
  throw MethodNotImplementedException("MySQL_Prepared_Statement::getUpdateCount");
  return 0; // fool compilers
}
1 голос
/ 22 июля 2015

Чтобы уточнить для других, потому что я был в замешательстве; сделай так:

pstmt = con->prepareStatement ("UPDATE localdata SET Val = ? WHERE ID = ?");
pstmt->setDouble (1, 7.77);    // first "?"
pstmt->setInt (2, 0);    // second "?"
pstmt->executeUpdate ();

Хитрость заключается в установке значений в соответствии с их типом таблицы и порядком в выражении.

1 голос
/ 03 февраля 2012

Я наконец нашел рабочее решение:

int updated_records = 0;

    //LOOP BEGIN
    pStatement->setInt(1, is_processed);
    pStatement->setString(2, record_id);

    updated_records += pStatement->executeUpdate();
    //LOOP END

cout << updated_records;

executeUpdate() возвращает количество затронутых строк, и оно работает без ошибок, так что мне этого достаточно.

...