📄 jtdsdatabasemetadata.java
字号:
upperCaseColumnNames(rs); return rs; } /** * Get a description of table columns available in a catalog. <P> * * Only column descriptions matching the catalog, schema, table and column * name criteria are returned. They are ordered by TABLE_SCHEM, TABLE_NAME * and ORDINAL_POSITION. <P> * * Each column description has the following columns: * <OL> * <LI> <B>TABLE_CAT</B> String =>table catalog (may be null) * <LI> <B>TABLE_SCHEM</B> String =>table schema (may be null) * <LI> <B>TABLE_NAME</B> String =>table name * <LI> <B>COLUMN_NAME</B> String =>column name * <LI> <B>DATA_TYPE</B> short =>SQL type from java.sql.Types * <LI> <B>TYPE_NAME</B> String =>Data source dependent type name * <LI> <B>COLUMN_SIZE</B> int =>column size. For char or date types this * is the maximum number of characters, for numeric or decimal types this * is precision. * <LI> <B>BUFFER_LENGTH</B> is not used. * <LI> <B>DECIMAL_DIGITS</B> int =>the number of fractional digits * <LI> <B>NUM_PREC_RADIX</B> int =>Radix (typically either 10 or 2) * <LI> <B>NULLABLE</B> int =>is NULL allowed? * <UL> * <LI> columnNoNulls - might not allow NULL values * <LI> columnNullable - definitely allows NULL values * <LI> columnNullableUnknown - nullability unknown * </UL> * * <LI> <B>REMARKS</B> String =>comment describing column (may be null) * * <LI> <B>COLUMN_DEF</B> String =>default value (may be null) * <LI> <B>SQL_DATA_TYPE</B> int =>unused * <LI> <B>SQL_DATETIME_SUB</B> int =>unused * <LI> <B>CHAR_OCTET_LENGTH</B> int =>for char types the maximum number * of bytes in the column * <LI> <B>ORDINAL_POSITION</B> int =>index of column in table (starting * at 1) * <LI> <B>IS_NULLABLE</B> String =>"NO" means column definitely does not * allow NULL values; "YES" means the column might allow NULL values. An * empty string means nobody knows. * </OL> * * * @param catalog a catalog name; "" retrieves those without a catalog; * <code>null</code> means drop catalog name from the selection criteria * @param schemaPattern a schema name pattern; "" retrieves those without a schema * @param tableNamePattern a table name pattern * @param columnNamePattern a column name pattern * @return ResultSet - each row is a column description * @throws SQLException if a database-access error occurs. * * @see #getSearchStringEscape */ public java.sql.ResultSet getColumns(String catalog, String schemaPattern, String tableNamePattern, String columnNamePattern) throws SQLException { String colNames[] = {"TABLE_CAT", "TABLE_SCHEM", "TABLE_NAME", "COLUMN_NAME", "DATA_TYPE", "TYPE_NAME", "COLUMN_SIZE", "BUFFER_LENGTH", "DECIMAL_DIGITS", "NUM_PREC_RADIX", "NULLABLE", "REMARKS", "COLUMN_DEF", "SQL_DATA_TYPE", "SQL_DATETIME_SUB", "CHAR_OCTET_LENGTH", "ORDINAL_POSITION", "IS_NULLABLE", "SCOPE_CATALOG", "SCOPE_SCHEMA", "SCOPE_TABLE", "SOURCE_DATA_TYPE"}; int colTypes[] = {Types.VARCHAR, Types.VARCHAR, Types.VARCHAR, Types.VARCHAR, Types.INTEGER, Types.VARCHAR, Types.INTEGER, Types.INTEGER, Types.INTEGER, Types.INTEGER, Types.INTEGER, Types.VARCHAR, Types.VARCHAR, Types.INTEGER, Types.INTEGER, Types.INTEGER, Types.INTEGER, Types.VARCHAR, Types.VARCHAR, Types.VARCHAR, Types.VARCHAR, Types.SMALLINT}; String query = "sp_columns ?, ?, ?, ?, ?"; CallableStatement s = connection.prepareCall(syscall(catalog, query)); s.setString(1, processEscapes(tableNamePattern)); s.setString(2, processEscapes(schemaPattern)); s.setString(3, catalog); s.setString(4, processEscapes(columnNamePattern)); s.setInt(5, 3); // ODBC version 3 JtdsResultSet rs = (JtdsResultSet)s.executeQuery(); CachedResultSet rsTmp = new CachedResultSet((JtdsStatement)s, colNames, colTypes); rsTmp.moveToInsertRow(); int colCnt = rs.getMetaData().getColumnCount(); // // Neither type of server returns exactly the data required by the JDBC3 standard. // The result data is copied to a cached result set and modified on the fly. // while (rs.next()) { if (serverType == Driver.SYBASE) { // Sybase servers (older versions only return 14 columns) for (int i = 1; i <= 4; i++) { rsTmp.updateObject(i, rs.getObject(i)); } rsTmp.updateInt(5, TypeInfo.normalizeDataType(rs.getInt(5))); String typeName = rs.getString(6); rsTmp.updateString(6, typeName); for (int i = 8; i <= 12; i++) { rsTmp.updateObject(i, rs.getObject(i)); } if (colCnt >= 20) { // SYBASE 11.92, 12.5 for (int i = 13; i <= 18; i++) { rsTmp.updateObject(i, rs.getObject(i + 2)); } } else { // SYBASE 11.03 rsTmp.updateObject(16, rs.getObject(8)); rsTmp.updateObject(17, rs.getObject(14)); } if ("image".equals(typeName) || "text".equals(typeName)) { rsTmp.updateInt(7, Integer.MAX_VALUE); rsTmp.updateInt(16, Integer.MAX_VALUE); } else if ("univarchar".equals(typeName) || "unichar".equals(typeName)) { rsTmp.updateInt(7, rs.getInt(7) / 2); rsTmp.updateObject(16, rs.getObject(7)); } else { rsTmp.updateInt(7, rs.getInt(7)); } } else { // MS SQL Server - Mainly OK but we need to fix some data types. for (int i = 1; i <= colCnt; i++) { if (i == 5) { int type = TypeInfo.normalizeDataType(rs.getInt(i)); rsTmp.updateInt(i, type); } else { rsTmp.updateObject(i, rs.getObject(i)); } } } rsTmp.insertRow(); } rs.close(); rsTmp.moveToCurrentRow(); rsTmp.setConcurrency(ResultSet.CONCUR_READ_ONLY); return rsTmp; } /** * Get a description of the foreign key columns in the foreign key table * that reference the primary key columns of the primary key table * (describe how one table imports another's key). This should normally * return a single foreign key/primary key pair (most tables only import a * foreign key from a table once.) They are ordered by FKTABLE_CAT, * FKTABLE_SCHEM, FKTABLE_NAME, and KEY_SEQ. <P> * * Each foreign key column description has the following columns: * <OL> * <LI> <B>PKTABLE_CAT</B> String =>primary key table catalog (may be * null) * <LI> <B>PKTABLE_SCHEM</B> String =>primary key table schema (may be * null) * <LI> <B>PKTABLE_NAME</B> String =>primary key table name * <LI> <B>PKCOLUMN_NAME</B> String =>primary key column name * <LI> <B>FKTABLE_CAT</B> String =>foreign key table catalog (may be * null) being exported (may be null) * <LI> <B>FKTABLE_SCHEM</B> String =>foreign key table schema (may be * null) being exported (may be null) * <LI> <B>FKTABLE_NAME</B> String =>foreign key table name being * exported * <LI> <B>FKCOLUMN_NAME</B> String =>foreign key column name being * exported * <LI> <B>KEY_SEQ</B> short =>sequence number within foreign key * <LI> <B>UPDATE_RULE</B> short =>What happens to foreign key when * primary is updated: * <UL> * <LI> importedNoAction - do not allow update of primary key if it has * been imported * <LI> importedKeyCascade - change imported key to agree with primary * key update * <LI> importedKeySetNull - change imported key to NULL if its primary * key has been updated * <LI> importedKeySetDefault - change imported key to default values * if its primary key has been updated * <LI> importedKeyRestrict - same as importedKeyNoAction (for ODBC 2.x * compatibility) * </UL> * * <LI> <B>DELETE_RULE</B> short =>What happens to the foreign key when * primary is deleted. * <UL> * <LI> importedKeyNoAction - do not allow delete of primary key if it * has been imported * <LI> importedKeyCascade - delete rows that import a deleted key * <LI> importedKeySetNull - change imported key to NULL if its primary * key has been deleted * <LI> importedKeyRestrict - same as importedKeyNoAction (for ODBC 2.x * compatibility) * <LI> importedKeySetDefault - change imported key to default if its * primary key has been deleted * </UL> * * <LI> <B>FK_NAME</B> String =>foreign key name (may be null) * <LI> <B>PK_NAME</B> String =>primary key name (may be null) * <LI> <B>DEFERRABILITY</B> short =>can the evaluation of foreign key * constraints be deferred until commit * <UL> * <LI> importedKeyInitiallyDeferred - see SQL92 for definition * <LI> importedKeyInitiallyImmediate - see SQL92 for definition * <LI> importedKeyNotDeferrable - see SQL92 for definition * </UL> * * </OL> * * @param primaryCatalog a catalog name; "" retrieves those without a * <code>null</code> means drop catalog name from the selection criteria * @param primarySchema a schema name pattern; "" retrieves those without a schema * @param primaryTable the table name that exports the key * @param foreignCatalog a catalog name; "" retrieves those without a * <code>null</code> means drop catalog name from the selection criteria * @param foreignSchema a schema name pattern; "" retrieves those without a schema * @param foreignTable the table name that imports the key * @return ResultSet - each row is a foreign key column description * @throws SQLException if a database-access error occurs. * * @see #getImportedKeys */ public java.sql.ResultSet getCrossReference(String primaryCatalog, String primarySchema, String primaryTable, String foreignCatalog, String foreignSchema, String foreignTable) throws SQLException { String colNames[] = {"PKTABLE_CAT", "PKTABLE_SCHEM", "PKTABLE_NAME", "PKCOLUMN_NAME", "FKTABLE_CAT", "FKTABLE_SCHEM", "FKTABLE_NAME", "FKCOLUMN_NAME", "KEY_SEQ", "UPDATE_RULE", "DELETE_RULE", "FK_NAME", "PK_NAME", "DEFERRABILITY"}; int colTypes[] = {Types.VARCHAR, Types.VARCHAR, Types.VARCHAR, Types.VARCHAR, Types.VARCHAR, Types.VARCHAR, Types.VARCHAR, Types.VARCHAR, Types.SMALLINT, Types.SMALLINT, Types.SMALLINT, Types.VARCHAR, Types.VARCHAR, Types.SMALLINT}; String query = "sp_fkeys ?, ?, ?, ?, ?, ?"; if (primaryCatalog != null) { query = syscall(primaryCatalog, query); } else if (foreignCatalog != null) { query = syscall(foreignCatalog, query); } CallableStatement s = connection.prepareCall(query); s.setString(1, primaryTable); s.setString(2, processEscapes(primarySchema)); s.setString(3, primaryCatalog); s.setString(4, foreignTable); s.setString(5, processEscapes(foreignSchema)); s.setString(6, foreignCatalog); JtdsResultSet rs = (JtdsResultSet)s.executeQuery(); int colCnt = rs.getMetaData().getColumnCount(); CachedResultSet rsTmp = new CachedResultSet((JtdsStatement)s, colNames, colTypes); rsTmp.moveToInsertRow(); while (rs.next()) { for (int i = 1; i <= colCnt; i++) { rsTmp.updateObject(i, rs.getObject(i)); } if (colCnt < 14) { rsTmp.updateShort(14, (short)DatabaseMetaData.importedKeyNotDeferrable); } rsTmp.insertRow(); } rs.close(); rsTmp.moveToCurrentRow(); rsTmp.setConcurrency(ResultSet.CONCUR_READ_ONLY); return rsTmp; } /** * Returns the name of this database product. * * @return database product name * @throws SQLException if a database-access error occurs. */ public String getDatabaseProductName() throws SQLException { return connection.getDatabaseProductName(); } /** * Returns the version of this database product. * * @return database version * @throws SQLException if a database-access error occurs. */ public String getDatabaseProductVersion() throws SQLException { return connection.getDatabaseProductVersion(); } //---------------------------------------------------------------------- /** * Returns the database's default transaction isolation level. The values
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -