元数据概述¶
数据库对象有不同的属性来描述它们;您可以通过执行DESCRIBE操作来获得关于特定模式对象的信息。通过将对象属性作为参数传递给元数据类的各种方法,可以将结果作为元数据类的对象访问。
可以在数据库中对ResultSet类中包含的列的类型和属性,或在以下模式和子模式对象上,如表、类型、序列、视图、类型属性列,程序,输入方法,参数,功能,集合,结果,包,同义词,和列表,总体执行一个明确的DESCRIBE操作。
必须指定要查找的属性的类型。通过使用MetaData类的getAttributeCount()、getAttributeId()和getAttributeType()方法,可以扫描每个可用的属性。
所有描述信息都被缓存,直到删除对它的最后一个引用为止。通过这种方式,用户可以避免意外地尝试访问已释放的描述信息。
在显式描述的情况下,通过调用Connection类上的getMetaData()方法获得元数据,或者通过调用ResultSet类上的getColumnListMetaData()方法获得结果集列的元数据。两种方法都返回带有描述信息的元数据对象。元数据类提供了getxxx()方法来访问此信息。
描述数据库元数据¶
描述数据库元数据等价于显式的DESCRIBE操作。要描述的对象必须是模式中的一个对象。在描述类型时,从连接调用getMetaData()方法,传递对象名称。您必须首先在对象模式中初始化环境。getMetaData()方法的作用是:返回一个MetaData类型的对象。每种元数据对象都有一个属性列表,这些属性是描述树的一部分。然后可以递归地遍历描述树,以指向包含更多信息的子树。关于对象的更多信息可以通过调用getxxx()方法获得。
如果您必须构造一个以递归方式描述数据库及其对象的浏览器,那么您可以访问关于数据库(包括数据库)中每个对象的属性数量、属性ID列表和属性类型列表的信息。通过使用这些信息,您可以递归地遍历描述树,从顶部节点(数据库)到表中的列、类型的属性、过程或函数的参数,等等。
例如,考虑描述表及其内容的典型情况。从连接调用getMetaData()方法,传递要描述的表的名称。返回的元数据对象包含表信息。因为您知道要描述的对象的类型(表、列、类型、集合、函数、过程,等等),所以您可以获得属性列表。通过调用相应的getxxx()方法,可以将值检索到表中指定类型的变量中。
使用元数据(代码示例)¶
/* 创建一个环境和到HR数据库的连接 */
……
/* 调用Connection对象obtainedv上的getMetaData方法*/
MetaData emptab_metaData = conn->getMetaData("EMPLOYEES", MetaData::PTYPE_TABLE);
/* 现在您已经在EMPLOYEES表中获得了元数据信息,使用适当的属性调用getxxx方法*/
/* 调用 getString */
cout<<"Schema:"<< (emptab_metaData.getString(MetaData::ATTR_OBJ_SCHEMA))<<endl;
if(emptab_metaData.getInt( emptab_metaData::ATTR_PTYPE)==MetaData::PTYPE_TABLE)
cout<<"EMPLOYEES is a table"<<endl;
else
cout<<"EMPLOYEES is not a table"<<endl;
/* 调用getInt以获取表中的列数 */
int columnCount=emptab_metaData.getInt(MetaData::ATTR_NUM_COLS);
cout<<"Number of Columns:"<<columnCount<<endl;
/* 调用getVector获取列表类型的属性,例如ATTR_LIST_COLUMNS */
vector<MetaData>listOfColumns;
listOfColumns=emptab_metaData.getVector(MetaData::ATTR_LIST_COLUMNS);
/* 每个列表元素代表一个列元数据,现在您可以访问列属性了*/
for (int i=0;i<listOfColumns.size();i++
{
MetaData columnObj=listOfColumns[i];
cout<<"Column Name:"<<(columnObj.getString(MetaData::ATTR_NAME))<<endl;
cout<<"Data Type:"<<(columnObj.getInt(MetaData::ATTR_DATA_TYPE))<<endl;
.
.
/* and so on to obtain metadata on other column specific attributes */
}
下面这个例子演示了如何从一个结果集中获取一个选择列表的元数据。
/* 创建一个环境和到数据库的连接 */
...
/* 创建一个语句并将其与select子句关联起来 */
string sqlStmt="SELECT * FROM EMPLOYEES";
Statement *stmt=conn->createStatement(sqlStmt);
/* 执行该语句以获得一个ResultSet */
ResultSet *rset=stmt->executeQuery();
/* 获取关于选择列表的元数据 */
vector<MetaData>cmd=rset->getColumnListMetaData();
/* 元数据是列列表,每个元素都是列元数据 */
int dataType=cmd[0].getInt(MetaData::ATTR_DATA_TYPE);
...