获取MySQL查询中返回数据的类型

时间:2012-12-04 10:24:06

标签: c++ mysql mysql-connector

我知道如何获取标准表中的列类型(例如SHOW FIELDS FROM ...),但有没有办法从自定义查询中获取返回数据的类型,其中包含各种列选择和连接不同的表格(例如SELECT table1.var1,table2.var2 FROM table1 JOIN table2)?

1 个答案:

答案 0 :(得分:8)

标题为Developing Database Applications Using MySQL Connector/C++的MySQL网站上的文章包含the following subsection

  

访问结果集元数据

     

当处理的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方法。

     

仅在Connector / C ++ 1.0.4及更高版本中支持方法PreparedStatement::getMetaData