1

从 java 程序中的 MS Access 数据库获取主键和外键约束。

我尝试使用desc table_name但没有用。

我什至尝试过DatabaseMetaData.getMetaData(null,null,"table_name"),但也没有用。

4

5 回答 5

0

使用DatabaseMetadata类。

从那个类使用getPrimaryKeys()方法

于 2013-03-12T09:37:33.670 回答
0

我不知道这是否会带来使用 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(...)获取主键

于 2013-03-12T09:40:26.753 回答
0

检索表的元数据很容易。你在你的桌子上构造一个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;每个键的每一列都有一个条目。

于 2013-03-12T09:50:57.123 回答
0

//获取主键的列名

      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));
于 2013-12-31T05:52:13.270 回答
0

简单的解决方案:

 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;    
  }
于 2014-01-15T08:31:05.143 回答