如何通过SQL查询获取MS Access中链接ODBC表的列信息
MS Access JDBC查询链接表列信息的实现方法
你之前查询的Information_schema.Columns、UCA_METADATA.Columns等视图无法拿到结果,是因为这类视图本身是SQL Server等服务端数据库的标准系统视图,Access桌面数据库对这类视图的支持极不完善,且链接表的字段元数据不会同步写入这类视图中。以下是两种可落地的实现方案,优先推荐第一种:
方案1:使用JDBC标准DatabaseMetaData接口获取(推荐)
这个方案不需要访问Access受限的系统表,不存在版本兼容问题和权限问题,不管链接表的数据源是SQL Server还是Excel都能正确返回元数据,是生产环境首选方案:
- 先通过你之前已经验证可用的
SELECT * FROM sys.MSysObjects Where Type = 4;语句拿到所有链接表,结果集中的Name字段就是链接表的表名,把这些表名存到列表里备用 - 调用JDBC连接自带的元数据接口遍历查询每个表的列信息,参考代码如下:
import java.sql.*; import java.util.ArrayList; import java.util.List; public class AccessLinkedTableMeta { public static void main(String[] args) throws SQLException { // 替换成你的Access JDBC实际连接串 String accessDbUrl = "jdbc:ucanaccess:///path/to/your/database.accdb"; try (Connection conn = DriverManager.getConnection(accessDbUrl)) { // 第一步:查询所有链接表名 List<String> linkedTableNames = new ArrayList<>(); try (Statement st = conn.createStatement(); ResultSet tableRs = st.executeQuery("SELECT Name FROM MSysObjects WHERE Type = 4")) { while (tableRs.next()) { linkedTableNames.add(tableRs.getString("Name")); } } // 第二步:遍历查询每个链接表的列信息 DatabaseMetaData meta = conn.getMetaData(); for (String tableName : linkedTableNames) { System.out.printf("===== 链接表:%s 列信息 =====%n", tableName); // getColumns参数:catalog、schema传null即可,表名传当前链接表名,列名匹配规则传%代表查询所有列 try (ResultSet colRs = meta.getColumns(null, null, tableName, "%")) { while (colRs.next()) { String colName = colRs.getString("COLUMN_NAME"); String colType = colRs.getString("TYPE_NAME"); int colLength = colRs.getInt("COLUMN_SIZE"); boolean isNullable = colRs.getInt("NULLABLE") == DatabaseMetaData.columnNullable; System.out.printf("列名:%s | 类型:%s | 长度:%d | 允许为空:%b%n", colName, colType, colLength, isNullable); } } } } } }
如果你用的是UCanAccess驱动(目前Java访问Access最常用的开源驱动),这个接口已经完全适配了本地表、SQL Server链接表、Excel链接表的元数据查询,不需要额外配置。
方案2:直接查询Access系统表(不推荐)
如果一定要通过SQL查询系统表拿列信息,需要先做权限配置,否则会报无访问权限:
- 打开Access客户端,打开对应的数据库文件,依次进入「文件-选项-当前数据库-导航选项」,勾选「显示系统对象」保存
- 在Access的安全设置中,给当前使用的数据库用户授予
MSysObjects、MSysColumns两个系统表的读取权限 - 执行关联查询语句即可拿到链接表的列信息,参考SQL:
SELECT o.Name AS linked_table_name, c.Name AS column_name, c.Type AS column_type_code, c.Length AS column_length, c.Required AS is_not_null FROM MSysObjects o INNER JOIN MSysColumns c ON o.Id = c.ObjectId WHERE o.Type = 4 -- 固定筛选类型为链接表
注意:Access不同版本的内部系统表结构可能存在差异,比如部分老版本Access的字段长度字段名不是Length,且需要手动配置权限,稳定性远低于方案1,非特殊情况不建议使用。
内容的提问来源于stack exchange,提问作者Kranthi.Gogikar
相关产品推荐
相关产品推荐

