我知道如何获取标准表中列的类型(例如SHOW FIELDS FROM ...
),但是有什么方法可以从自定义查询中获取返回数据的类型,其中包含不同的列选择和不同表的连接(例如SELECT table1.var1,table2.var2 FROM table1 JOIN table2
)?
1 回答
MySQL 站点上标题为使用 MySQL 连接器/C++ 开发数据库应用程序的文章包含以下小节:
访问结果集元数据
当正在处理的 SQL 语句直到运行时才知道时,该
ResultSetMetaData
接口可用于确定用于从结果集中检索数据的方法。ResultSetMetaData
提供有关给定结果集结构的信息。对象提供的数据ResultSetMetaData
包括结果集中的列数、名称或标签以及这些列的类型以及每列的属性以及指定列的表所属的表、模式和目录的名称。当
getMetaData()
在ResultSet
对象上调用时,它会返回一个ResultSetMetaData
描述该对象列的ResultSet
对象。一些相关方法的签名如下所示。有关
ResultSetMetaData
接口支持的方法的完整列表,请检查连接器/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 及更高版本中受支持。