我想使用 JDBC 元数据获取列注释,但每次它返回 null 时,我用 Oracle 和 SqlServer 测试了这两种情况,它都返回 Null。
DatabaseMetaData dmt = con.getMetaData();
colRs = dmt.getColumns(null, "dbo", 'Student', null);
while (colRs.next()) {
System.out.println(colRs.getString("REMARKS");
}
虽然我得到了所有其他数据,如列名、长度等,但绝对没问题......
对于 Oracle,您需要提供连接属性
remarksReporting
并将其设置为 true
或调用方法 setRemarksReporting()
来启用它。
OracleConnection oraCon = (OracleConnection)con;
oraCon.setRemarksReporting(true);
之后,
getColumns()
将返回ResultSet的REMARKS
列中的列(或表)注释。
请参阅Oracle 的 JDBC 参考了解更多详细信息
对于 SQL Server,这是根本不可能的。
Microsoft 和 jTDS 驱动程序都不会公开表或列注释。可能是因为 SQL Server 中没有对此的 SQL 支持。使用“扩展属性”和属性名称 MS_DESCRIPTION 的通常方法并不可靠。主要是因为我们没有要求
MS_DESCRIPTION
作为属性名称。甚至sp_help
也没有回复这些评论。至少 jTDS 驱动程序只需调用 sp_help
进入表列。我不知道微软的驱动程序是做什么的。
您唯一的选择是使用
fn_listextendedproperty()
检索评论:
例如:
SELECT objname, cast(value as varchar(8000)) as value
FROM fn_listextendedproperty ('MS_DESCRIPTION','schema', 'dbo', 'table', 'Student', 'column', null)
您需要将
MS_DESCRIPTION
替换为您用来存储评论的任何属性名称。
问题是 DatabaseMetaData 中的 getColumns() 方法默认情况下不会检索 Oracle 数据库的列注释/备注。要在 Oracle 中获取列注释,您需要查询 ALL_COL_COMMENTS 视图:
// Query comments
String sql = "SELECT column_name, comments FROM all_col_comments WHERE table_name = ?";
PreparedStatement ps = connection.prepareStatement(sql);
ps.setString(1, tableName);
ResultSet rs2 = ps.executeQuery();
while (rs2.next()) {
String name = rs2.getString("column_name");
String comment = rs2.getString("comments");
}