Неверный аргумент для getUInt64 при получении LAST_INSERT_ID ()

0

Я добавил запись в свою таблицу, которая автоматически увеличивает первичный ключ. Мне не повезло получить это новое значение. Документы MySQL говорят, что использовать SELECT LAST_INSERT_ID(); в запросе. Я сделал это, но не могу получить результаты.

В соответствии с метаданными набора результатов тип данных BIGINT, а имя столбца LAST_INSERT_ID(). У С++-коннектора есть getUInt64() для набора результатов, который я считаю правильным методом.

Объявление класса ResultSet содержит следующее:

virtual uint64_t getUInt64(uint32_t columnIndex) const = 0;
virtual uint64_t getUInt64(const std::string& columnLabel) const = 0;

В документации не указано, является ли columnIndex основанием на основе нуля или одним. Я попробовал оба и получил sql::InvalidArgumentException для обоих случаев.

Используя метаданные набора результатов, я получил имя столбца и передал его непосредственно методу getUInt64 и все еще получаю sql::InvalidArgumentException. Это не является хорошим показателем (когда имя возвращаемого столбца не работает при извлечении данных).

Вот мой фрагмент кода:

std::string query_text;
query_text = "SELECT LAST_INSERT_ID();";
boost::shared_ptr<sql::Statement>   query(m_db_connection->createStatement());
boost::shared_ptr<sql::ResultSet>   query_results(query->executeQuery(query_text));
long    id_value = 0;
if (query_results)
{
    ResultSetMetaData p_metadata = NULL;
    p_metadata = query_results->getMetaData();
    unsigned int columns = 0;
    columns = p_metadata->getColumnCount();
    std::string column_label;
    std::string column_name;
    std::string column_type;
    for (i = 0; i < columns; ++i)
    {
        column_label = p_metadata->getColumnLabel(i);
        column_name  = p_metadata->getColumnName(i);
        column_type  = p_metadata->getColumnTypeName(i);
        wxLogDebug("Column label: \"%s\"\nColumn name: \"%s\"\nColumn type: \"%s\"\n",
                   column_label.c_str(),
                   column_name.c_str(),
                   column_type.c_str());
    }
    unsigned int    column_index = 0;
    column_index = query_results->findColumn(column_name);
    // The value of column_index is 1 (one).

    // All of the following will generate sql::InvalidArgumentException
    id_value = query_results->getUInt64(column_index);
    id_value = query_results->getUInt64(column_name);
    id_value = query_results->getUInt64(0);
    id_value = query_results->getUInt64(1);
    id_record.set_record_id(id_value);
}

Вот вывод отладки (из wxLogDebug):

10:50:58: Column label: "LAST_INSERT_ID()"
Column name: "LAST_INSERT_ID()"
Column type: "BIGINT"

Мой вопрос: Как получить LAST_INSERT_ID() с помощью MySQL С++ Connector?

Нужно ли вместо этого использовать подготовленный оператор?

Я использую MySQL Connector С++ 1.0.5 для Windows Vista и Windows XP с Visual Studio 9 (2008).

Теги:
database
mysql-connector

1 ответ

0
Лучший ответ

Решенный.

Я вставил query_results->next(), прежде чем извлекать данные и которые сработали.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню