Argumento no válido para getUInt64 al recuperar LAST_INSERT_ID ()
-
26-09-2019 - |
Pregunta
He añadido un registro a mi mesa, que auto-incrementos de la clave principal. Estoy teniendo ninguna suerte de recuperar este nuevo valor. Los documentos dicen MySQL a usar el SELECT LAST_INSERT_ID();
en una consulta. Yo he hecho esto, pero no puedo recuperar los resultados.
Según el los metadatos del conjunto de resultados, el tipo de datos es BIGINT
y el nombre de la columna es LAST_INSERT_ID()
. El conector C ++ tiene una getUInt64()
para el conjunto de resultados, que supongo es el método correcto para el uso.
La declaración de la clase ResultSet
contiene lo siguiente:
virtual uint64_t getUInt64(uint32_t columnIndex) const = 0;
virtual uint64_t getUInt64(const std::string& columnLabel) const = 0;
La documentación no indica si el columnIndex
es cero o uno basado en base. He intentado tanto y conseguir sql::InvalidArgumentException
para ambos casos.
Uso de los metadatos conjunto de resultados, I recuperó el nombre de la columna y se pasa directamente al método getUInt64
y aún así recibir el sql::InvalidArgumentException
. Esta no es una buena indicación (cuando el nombre de columna devuelto no funciona cuando ir a buscar los datos).
Aquí está mi fragmento de código:
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);
}
Aquí está el resultado de la depuración (de wxLogDebug):
10:50:58: Column label: "LAST_INSERT_ID()"
Column name: "LAST_INSERT_ID()"
Column type: "BIGINT"
Mi Pregunta: ¿Cómo recuperar el LAST_INSERT_ID () mediante el conector de MySQL C ++
?¿Es necesario usar una declaración preparada en su lugar?
Estoy utilizando MySQL Connector C ++ 1.0.5 en Windows Vista y Windows XP con Visual Studio 9 (2008).
Solución
Se resuelve.
inserta un query_results->next()
antes de recuperar los datos y que trabajado.