从 java 程序中的 MS Access 数据库获取主键和外键约束。
我尝试使用desc table_name
但没有用。
我什至尝试过DatabaseMetaData.getMetaData(null,null,"table_name")
,但也没有用。
使用DatabaseMetadata
类。
从那个类使用getPrimaryKeys()
方法
我不知道这是否会带来使用 MS Access 数据库的问题,但是阅读 JDBC 规范您应该执行以下步骤。
从数据库获取表使用
DatabaseMetaData meta = connection.getMetaData();
ResultSet tablesRs = meta.getTables(null, null, "table_name", new String[]{"TABLE"});
获取主键使用
meta.getPrimaryKeys(null, null, "table_name");
获取外键使用
meta.getExportedKeys(null, null, "table_name");
编辑:
似乎它没有为 ODBC 驱动程序实现,您必须查看这篇文章如何使用 ODBC 驱动程序与 MS Access 数据库一起获取主键。
这里
用于meta.getIndexInfo(...)
获取主键
检索表的元数据很容易。你在你的桌子上构造一个SQL
并执行它。从结果ResultSet
中,您可以检索MetaDataResultSet
其中包含字段名称、字段类型等内容nullable and autoincrement
:试试这个:
ResultSet set =stmt.executeQuery(sql);//stmt is your Prepared or Callable Statement object
ResultSetMetaData resultMeta = set.getMetaData();
for (int i=1;i< =resultMeta.getColumnCount();i++)
{
String fieldName = resultMeta.getColumnName(i);
int type = resultMeta.getColumnType(i); // java.sql.Types
Class _fieldType = convertType(type);
boolean nullable = resultMeta.isNullable(i)!=java.sql.ResultSetMetaData.columnNoNulls;
boolean isAutoincrement = resultMeta.isAutoIncrement(i);
System.out.printf("Field: %s, %s, nullable %b, autoincrement
%b%n",fieldName,_fieldType.getName(),nullable,isAutoincrement);
}
该类型在 java.sql.Types 中指定为整数常量。可以从可以从连接中检索的 DatabaseMetaData 中检索有关约束的信息。有3种方法:
getPrimaryKeys(catalog,schema,table):
检索包含的 ResultSet;每个主键的每一列都有一个条目。
getIndexInfo(catalog,schema,table,unique,false):
检索唯一索引和其他索引。您检索一个 ResultSet,其中包含每个索引的每一列的一个条目。如果 unique 为 false,则结果包含唯一键和非唯一键。
getExportedKeys(catalog,schema,table):
检索包含所有外键的 ResultSet;每个键的每一列都有一个条目。
//获取主键的列名
DatabaseMetaData meta=conn.getMetaData();
rs= meta.getTables(null, null, tablename, new String[]{"TABLE"});
rs=meta.getPrimaryKeys(null, null, tablename);
while(rs.next())
System.out.println("Primery Key :"+rs.getString(4));
//还有外键约束
rs=meta.getExportedKeys(null, null, tablename);
while(rs.next())
System.out.println("Foreign Key :"+rs.getString(4));
简单的解决方案:
public String getPrimaryKey(String table) throws SQLException
{
con = null;
con = DriverManager.getConnection("jdbc:odbc:DRIVER={Microsoft Access Driver (*.mdb)};DBQ=//access_file_path/database_name.mdb", "username", "password");
Statement stmt = con.createStatement();
ResultSet rs = stmt.executeQuery("SELECT * FROM "+table);
ResultSetMetaData rsmd = rs.getMetaData();
int cols = rsmd.getColumnCount();
String primaryKey_columnName = "";
boolean isAutoIncrement;
for(int x = 1;x<=cols;x++){
isAutoIncrement = rsmd.isAutoIncrement(x);
if(isAutoIncrement){
primaryKey_columnName = rsmd.getColumnName(x);
}
}
rs.close();
con.close();
return primaryKey_columnName;
}