sql-server - MSSQL 和 JDBC 读取 DBCC USEROPTIONS

标签 sql-server jdbc spring-jdbc

我正在尝试读取以下命令返回的一些属性

DBCC USEROPTIONS

如何在 JDBC 中使用以下命令?

    List<ResultVO> list = getJdbcTemplate().query(sql, new ParameterizedBeanPropertyRowMapper<ResultVO>() {
        @Override
        public ResultVO mapRow(ResultSet rs, int rowNumber) throws SQLException {
            System.out.println(rowNumber);
            ResultVO v = new ResultVO();
            v.setSetOption(rs.getString(0));
            v.setValue(rs.getString(1));
            //--
            return v;
        }
    }, (List<String>) null);

它抛出异常如下:

Caused by: org.springframework.dao.TransientDataAccessResourceException: PreparedStatementCallback; SQL [SELECT DBCC USEROPTIONS]; The index 1 is out of range.; nested exception is com.microsoft.sqlserver.jdbc.SQLServerException: The index 1 is out of range.
    at org.springframework.jdbc.support.SQLStateSQLExceptionTranslator.doTranslate(SQLStateSQLExceptionTranslator.java:106)
    at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:72)

最佳答案

错误消息的第一行表明您的代码尝试执行 SQL 语句

SELECT DBCC USEROPTIONS

但这不是有效的 T-SQL 语法。 T-SQL语句

DBCC USEROPTIONS

确实返回一个有效的 ResultSet,如以下普通 JDBC 代码所示:

try (Connection conn = DriverManager.getConnection(connectionUrl)) {
    try (
            Statement s = conn.createStatement();
            ResultSet rs = s.executeQuery("DBCC USEROPTIONS")) {
        ResultSetMetaData rsmd = rs.getMetaData();
        for (int i = 1; i <= rsmd.getColumnCount(); i++) {
            System.out.printf("[%s]: %s%n", rsmd.getColumnName(i), rsmd.getColumnTypeName(i));
        }
        System.out.println();
        while (rs.next()) {
            System.out.printf("%s: %s%n", rs.getString(1), rs.getString(2));
        }
    }
} catch (Exception e) {
    e.printStackTrace(System.err);
}

产生

[Set Option]: nvarchar
[Value]: nvarchar

textsize: -1
language: us_english
dateformat: mdy
datefirst: 7
lock_timeout: -1
quoted_identifier: SET
ansi_null_dflt_on: SET
ansi_warnings: SET
ansi_padding: SET
ansi_nulls: SET
concat_null_yields_null: SET
isolation level: read committed

看来您需要调整 Spring JDBC 代码以仅执行 DBCC USEROPTIONS

关于sql-server - MSSQL 和 JDBC 读取 DBCC USEROPTIONS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34955659/

相关文章:

c# - 多用户应用程序的组织

java - 多次重用 PreparedStatement

android 建立 mysql 连接并获取一些数据

java - SimpleJdbcCall : get result of Microsoft/Sybase stored procedure call

c# - 具有默认值的 DateTime 的 Fluent NHibernate 映射

sql - 如何在SQL Server中获取一个月中的天数

sql-server - 如何强制执行包含多个表的唯一性规则?

java - 尝试连接到MySQL时出现NullPointerException

Spring 事务管理 : Read uncommitted data in same transaction

java - CannotLoadBeanClassException : Cannot find class [org. springframework.jdbc.datasource.DriverManagerDataSource]