0

主キーを自動インクリメントするレコードをテーブルに追加しました。私はこの新しい値を取得する運がありません。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ドキュメントには、がゼロベースか1ベースかは記載されていません。私は両方を試し、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()を取得するにはどうすればよいですか?

代わりにプリペアドステートメントを使用する必要がありますか?

Visual Studio 9(2008)を搭載したWindowsVistaおよびWindowsXPでMySQLConnector C++1.0.5を使用しています。

4

1 に答える 1

0

解決しました。

query_results->next()データを取得する前にを挿入しましたが、それは機能しました。

于 2010-05-11T18:58:50.740 に答える