我已經向我的表添加了一條記錄,該記錄自動遞增主鍵。我沒有運氣檢索這個新的價值。 MySQL文檔聲稱在查詢中使用SELECT LAST_INSERT_ID();
。我已經這樣做了,但無法檢索結果。檢索LAST_INSERT_ID時獲取UInt64的無效參數()
根據結果集的元數據,數據類型爲BIGINT
,列名爲LAST_INSERT_ID()
。 C++連接器對結果集有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 C++連接器?
我需要使用準備好的語句嗎?
我在使用Visual Studio 9(2008)的Windows Vista和Windows XP上使用MySQL Connector C++ 1.0.5。