检索 LAST_INSERT_ID() 时 getUInt64 的参数无效

Posted

技术标签:

【中文标题】检索 LAST_INSERT_ID() 时 getUInt64 的参数无效【英文标题】:Invalid Argument to getUInt64 when retrieving LAST_INSERT_ID() 【发布时间】:2010-05-11 18:12:59 【问题描述】:

我在表中添加了一条自动递增主键的记录。我没有运气检索这个新值。 mysql 文档说在查询中使用SELECT LAST_INSERT_ID();。我已经这样做了,但无法检索结果。

根据结果集的元数据,数据类型为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"

我的问题:如何使用 MySQL C++ 连接器检索 LAST_INSERT_ID()?

我需要使用准备好的语句吗?

我在 Windows Vista 和带有 Visual Studio 9 (2008) 的 Windows XP 上使用 MySQL Connector C++ 1.0.5。

【问题讨论】:

【参考方案1】:

已解决。

我在检索数据之前插入了一个query_results-&gt;next(),这很有效。

【讨论】:

以上是关于检索 LAST_INSERT_ID() 时 getUInt64 的参数无效的主要内容,如果未能解决你的问题,请参考以下文章

如何从事务中的特定查询中检索 last_insert_id?

是否有等效于 LAST_INSERT_ID 的时间戳?

MYSQL LAST_INSERT_ID 未按预期工作。我该如何解决?

使用外键时更改 LAST_INSERT_ID()

后跟 SELECT LAST_INSERT_ID 时 INSERT 不起作用

LAST_INSERT_ID() MySQL