有时,我们对一种新的数据库根本不知道它的结构或者是其中的内容,好坏么我们如何来获取数据库的情况呢?
真实的例子是这样的,我的朋友的公司接到了一个单子,对方使用的数据库是叫什么/"titanium/"的,说实话由于本人的孤陋寡闻,在此之前从来不知道还有这种数据库,更别说如何访问了,现在朋友要看里面有什么/"东西/",当然是一筹莫展.所以只好找我.
接到电话后,我先问他是什么平台上跑的,如果连结的,他说是在windows下可以建立odbc数据源,哈哈,就是说可以用java建立connection了,ok只能建立一下connection,那么就可以得到这个数据库的所有元信息:
databasemetadata dbmd = conn.getmetadata();然后你可以从这个对象获取以下信息:
geturl(); //返回与这个数据库的连结的url,当然是已知的,要不你怎么连上去
getusername(); //返回与这个数据库的连结的用户,同上
isreadonly();数据库是否为只读
getdatabaseproducename();//数据库产品名称
getdatabaseproduceversion();//版本号
getdrivername();//驱动程序
getdriverversion();//驱动程序版本
以上内容没有什么意义
resultset gettables(string catalog,
string schemapattern,
string tablenamepattern,
string[] types)
可以得到该库中/"表/"的所有情况,这里的表包括表,视图,系统表,临时空间,别名,同义词对于各参数:
string catalog,表的目录,可能为null,/"null/"匹配所有
string schemapattern,表的大纲,同上
string tablenamepattern,表名,同上
string[] types,表的类型,/"null/"匹配所有,可用的类型为:
table,view,sysem table,global temporary,local temporary,alias,synonym
例如:
databasemetadata dbmd = conn.getmetadata();
resultset rs = dbmd.gettables(null,null,null,null);
resultsetmetadata rsmd = rs.getmetadata();
int j = rsmd.getcolumncount();
for(int i=1;i<=j;i++){
out.print(rsmd.getcolumnlabel(i)+/"//t/");
}
out.println();
while(rs.next()){
for(int i=1;i<=j;i++){
out.print(rs.getstring(i)+/"//t/");
}
out.println();
}
对于更详细的表中的列的信息,可以用dbmd(不是rsmd).getcolumns(
string catalog,
string schemapattern,
string tablenamepattern,
string columnnamepattern
)
不仅可以获得rsmd中的信息,还可以获得列的大小,小数位数,精度,缺省值,列在表中的位置等相关信息.
还有两个方法,调用和获取表信息一样,可以获得存储过程和索引的信息:
resultset getprocedures(
string catalog,
string schemapattern,
string procedurepattern
);
resultset getindexinfo(
string catalog,
string schemapattern,
string table,
boolean unique,boolean approximate
);
闽公网安备 35060202000074号