標準テーブル (例: SHOW FIELDS FROM ...
) の列の型を取得する方法は知っていますが、さまざまな列の選択と異なるテーブルの結合 (例: SELECT table1.var1,table2.var2 FROM table1 JOIN table2
) を含むカスタム クエリから返されるデータの型を取得する方法はありますか?
1 に答える
MySQL Connector / C ++を使用したデータベースアプリケーションの開発というタイトルのMySQLサイトの記事には、次のサブセクションが含まれています。
結果セットのメタデータへのアクセス
処理中のSQLステートメントが実行時まで不明な場合は、
ResultSetMetaData
インターフェースを使用して、結果セットからデータを取得するために使用するメソッドを決定できます。ResultSetMetaData
特定の結果セットの構造に関する情報を提供します。オブジェクトによって提供されるデータResultSetMetaData
には、結果セット内の列の数、名前またはラベル、それらの列のタイプ、各列の属性、指定された列のテーブルが属するテーブル、スキーマ、およびカタログの名前が含まれます。
getMetaData()
オブジェクトでが呼び出されると、そのオブジェクトの列を説明するオブジェクトResultSet
が返されます。ResultSetMetaData
ResultSet
関連するメソッドのいくつかのシグネチャを以下に示します。インターフェイスでサポートされているメソッドの完全なリストについては
ResultSetMetaData
、Connector /C++インストールのresultset_metadata.hヘッダーを確認してください。/* resultset.h */ ResultSetMetaData * ResultSet::getMetaData() const; /* prepared_statement.h */ ResultSetMetaData * PreparedStatement::getMetaData() const; /* resultset_metadata.h */ std::string ResultSetMetaData::getCatalogName(unsigned int columnIndex); std::string ResultSetMetaData::getSchemaName(unsigned int columnIndex); std::string ResultSetMetaData::getTableName(unsigned int columnIndex); unsigned int ResultSetMetaData::getColumnCount(); unsigned int ResultSetMetaData::getColumnDisplaySize(unsigned int columnIndex); std::string ResultSetMetaData::getColumnLabel(unsigned int columnIndex); std::string ResultSetMetaData::getColumnName(unsigned int columnIndex); int ResultSetMetaData::getColumnType(unsigned int columnIndex); std::string ResultSetMetaData::getColumnTypeName(unsigned int columnIndex); int ResultSetMetaData::isNullable(unsigned int columnIndex); bool ResultSetMetaData::isReadOnly(unsigned int columnIndex); bool ResultSetMetaData::isWritable(unsigned int columnIndex);
次のコードフラグメントは、すべての列名またはラベル、それらのデータ型とサイズ、およびそれらが属するテーブル名とスキーマ名を取得する方法を示しています。
ResultSet *rs; ResultSetMetaData *res_meta; res_meta = rs -> getMetaData(); int numcols = res_meta -> getColumnCount(); cout << "\nNumber of columns in the result set = " << numcols << endl; cout.width(20); cout << "Column Name/Label"; cout.width(20); cout << "Column Type"; cout.width(20); cout << "Column Size" << endl; for (int i = 0; i < numcols; ++i) { cout.width(20); cout << res_meta -> getColumnLabel (i+1); cout.width(20); cout << res_meta -> getColumnTypeName (i+1); cout.width(20); cout << res_meta -> getColumnDisplaySize (i+1) << endl; } cout << "\nColumn \"" << res_meta -> getColumnLabel(1); cout << "\" belongs to the Table: \"" << res_meta -> getTableName(1); cout << "\" which belongs to the Schema: \"" << res_meta -> getSchemaName(1) << "\"" << endl; //delete res_meta; delete rs;
リリース1.0.5以降では、
ResultSetMetaData
オブジェクトがスコープから外れると、コネクタがオブジェクトのクリーニングを自動的に処理します。これにより、クライアントがResultSetMetaData
オブジェクトを明示的に削除する必要がなくなります。ResultSetMetaData
メタデータオブジェクトが暗黙的に破棄されるため、クライアントはオブジェクトを直接削除できません。オブジェクトを削除しようとするとResultSetMetaData
、コンパイル時エラーが発生します。同様に、auto_ptr
テンプレートクラスを使用してタイプのオブジェクトをインスタンス化するとResultSetMetaData
、コンパイル時エラーが発生します。たとえば、上記のコードのコンパイルは、ステートメントdelete res_meta;
がコメント化されていない場合、Connector / C++1.0.5以降のバージョンでは失敗します。プリペアドステートメントと結果セットのメタデータ
PreparedStatement::getMetaData()
ResultSetMetaData
オブジェクトの列に関する情報を含むオブジェクトを取得します。この情報はResultSet
、オブジェクトの実行時に返さPreparedStatement
れます。オブジェクトはプリコンパイルされているため、実行しなくてもオブジェクトが返されること
PreparedStatement
を知ることができます。ResultSet
したがって、オブジェクトの実行を待ってから、返されたオブジェクトに対してメソッドを呼び出すのではなくgetMetaData
、オブジェクトに対してメソッドを呼び出すことができます。PreparedStatement
ResultSet::getMetaData
ResultSet
このメソッド
PreparedStatement::getMetaData
は、Connector / C++1.0.4以降のバージョンでのみサポートされています。