gpt4 book ai didi

java - 您能否从 SQLException 中确定使用的是哪个数据库供应商?

转载 作者:行者123 更新时间:2023-12-02 00:14:02 25 4
gpt4 key购买 nike

我假设简单的答案是,但想知道Java忍者是否知道一个聪明的黑客......更具体地说,我的问题是我正在尝试创建自动化可以从其他数据格式(xml、另一个数据库供应商、json...)中提取/恢复数据库。我试图将供应商特定代码的范围限制为 *Adapter 类。界面为:

public String escapeName( String name );

public ColumnMetaData columnMetaDataFromResultSet( ResultSet resultSet ) throws SQLException;

public SqlQuery getColumnMetaDataSql( String schema, String table );

public String getCreateTableSql( TableMetaData tableMetaData );

public String getDropTableSql( TableMetaData tableMetaData );

public String getRowInsertSql( TableMetaData tableMetaData );

public String getRowSelectSql( TableMetaData tableMetaData );

public SqlQuery getTableMetaDataSql();

public TableMetaData tableMetaDataFromResultSet( ResultSet resultSet ) throws SQLException;

解决这个问题的重要方法是getDropTableSql( TableMetaData tableMetaData )。该方法理论上会返回一个 SQL 语句,该语句将删除元数据指示的表,以便可以重新创建它(这用于在固定期限的基础上发布完整的数据集,以便淘汰旧的,加入新的)。 MySQL 和 SQLServer 的适配器都支持某种安全DROP(DROP table IF EXISTS 或类似),但 Oracle 和 DB2 不支持。所以我的下一个想法是放弃它并捕获适当的异常。但抛出的异常是java.sql.SQLSyntaxErrorException(或org.springframework.jdbc.BadSqlGrammarException,因为我使用的是springs JdbcTemplate)。该异常家族似乎过于广泛,无法安全捕获(而且对我来说,它实际上不像语法......)。每个供应商似乎返回不同的 SQLState 和 ErrorCode,因此除非我也可以确定供应商,否则这些没有多大帮助。那么,我可以吗?我知道 spring 以某种方式做到了这一点,最有可能是通过从发出查询的 DataSource 中挖掘它。只是还没想明白。

---------------------- 更新 ------------------------ ---

我能够用这段代码实现我的目标:

private void dropTable( JdbcTemplate jdbcTemplate, String dropSql ) {
try {
jdbcTemplate.execute( dropSql );
}
catch ( BadSqlGrammarException sqle ) {
try {
throw sqle.getRootCause();
}
catch ( SQLException rootCause ) {
int errorCode = rootCause.getErrorCode();
String sqlState = rootCause.getSQLState();

try {
String vendor = jdbcTemplate.getDataSource().getConnection().getMetaData().getDatabaseProductName();

if ( vendor.equalsIgnoreCase( "mysql" ) && errorCode == 1051 && sqlState.equals( "42S02" ) ) {
logger.info( "mysql table does not exist, unable to drop ({})", dropSql );
}
else if ( vendor.equalsIgnoreCase( "oracle" ) && errorCode == 942 && sqlState.equals( "42000" ) ) {
logger.info( "oracle table does not exist, unable to drop ({})", dropSql );
}
else {
throw( sqle );
}
}
catch ( Exception e ) {
throw( sqle );
}
}
catch ( Throwable e ) {
throw sqle;
}
}
}

最佳答案

您可以使用DatabaseMetaData.getDatabaseProductName()检查数据库供应商的名称。

这样你就不需要“分析”异常

关于java - 您能否从 SQLException 中确定使用的是哪个数据库供应商?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12223159/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com