3

標準テーブル (例: SHOW FIELDS FROM ...) の列の型を取得する方法は知っていますが、さまざまな列の選択と異なるテーブルの結合 (例: SELECT table1.var1,table2.var2 FROM table1 JOIN table2) を含むカスタム クエリから返されるデータの型を取得する方法はありますか?

4

1 に答える 1

8

MySQL Connector / C ++を使用したデータベースアプリケーションの開発というタイトルのMySQLサイトの記事には、次のサブセクションが含まれています。

結果セットのメタデータへのアクセス

処理中のSQLステートメントが実行時まで不明な場合は、ResultSetMetaDataインターフェースを使用して、結果セットからデータを取得するために使用するメソッドを決定できます。ResultSetMetaData特定の結果セットの構造に関する情報を提供します。オブジェクトによって提供されるデータResultSetMetaDataには、結果セット内の列の数、名前またはラベル、それらの列のタイプ、各列の属性、指定された列のテーブルが属するテーブル、スキーマ、およびカタログの名前が含まれます。

getMetaData()オブジェクトでが呼び出されると、そのオブジェクトの列を説明するオブジェクトResultSetが返されます。ResultSetMetaDataResultSet

関連するメソッドのいくつかのシグネチャを以下に示します。インターフェイスでサポートされているメソッドの完全なリストについては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、オブジェクトに対してメソッドを呼び出すことができます。PreparedStatementResultSet::getMetaDataResultSet

このメソッドPreparedStatement::getMetaDataは、Connector / C++1.0.4以降のバージョンでのみサポートされています。

于 2012-12-26T15:26:52.700 に答える