java - 通过java执行SQL查询时出现错误 "java.sql.SQLException: Invalid column index"

标签 java jdbc

任何人都可以建议我在这里做错了什么,尝试在控制台中打印 SQL 查询输出,但收到错误“java.sql.SQLException:无效的列索引”。

import java.io.*;  
import java.sql.*;  

public class RetrieveFile {  
    public static void main(String args[]) throws Exception {
        try {
            Class.forName("oracle.jdbc.driver.OracleDriver");
            Connection con = DriverManager.getConnection("jdbc:oracle:thin:@123.43.23.43:8080/orcl", "Test", "*****");

            PreparedStatement ps = con.prepareStatement("select * from MSG where MSD='1234'");
            ResultSet rs = ps.executeQuery();
            // rs.next();//now on 1st row
            while (rs.next()) {

                int numberOfColumns = 0;
                for (int column = 1; column >= numberOfColumns; column++) {

                    if (column > 1)
                        System.out.print(", ");
                    System.out.print(rs.getString(column));
                }
            }

            con.close();

            // System.out.println("success" + (rs.getString(1)));
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}  

我收到了部分响应,但最终收到以下错误。

ERROR:

null, 1234, 389, OUR, NOW, USD, 0, 0, FR1, wert, USD, 0, null, 0, 0, null, DR, null, null, 0, 0, null, null, null, null, null, null, null, null, null, 0, 2, 2019-06-11 00:00:00.0, null, null, null, null, null, null, null, java.sql.SQLException: Invalid column index at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:112) at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:146) at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:208) at oracle.jdbc.driver.OracleResultSetImpl.getString(OracleResultSetImpl.java:379) at RetrieveFile.main(RetrieveFile.java:20) Picked up JAVA_TOOL_OPTIONS: -Duser.home=C:\Users\45060849

请在输出中包含MSG的表结构 提前致谢。

最佳答案

如果您既不知道列数,也不知道它们的数据类型,则必须通过 ResultSetMetaData 检查它们。
下面的示例在一个单独的方法中执行此操作,该方法尚未考虑所有可能的 SQL 数据类型,但考虑了一些非常常见的数据类型。

public static void main(String args[]) throws Exception {
    try {
        Class.forName("oracle.jdbc.driver.OracleDriver");
        Connection con = DriverManager.getConnection("jdbc:oracle:thin:@123.43.23.43:8080/orcl", "Test", "*****");

        PreparedStatement ps = con.prepareStatement("select * from MSG where MSD='1234'");
        ResultSet rs = ps.executeQuery();

        try {
            printResultColumns(rs);
        } catch (SQLException e) {
            System.err.println(e.getMessage());
        }

        con.close();
    } catch (Exception e) {
        e.printStackTrace();
    }
}

您基本上请求列的数量,将其用作迭代边框,然后您可以检查列i的类型。这是必需的,因为不同的数据类型有不同的方法。

public static void printResultColumns(ResultSet resultSet) throws SQLException {
    ResultSetMetaData rsmd = resultSet.getMetaData();
    int columnCount = rsmd.getColumnCount();

    while (resultSet.next()) {
        // you get a single result row in here, not the entire ResultSet
        for (int i = 1; i <= columnCount; i++) {
            switch (rsmd.getColumnType(i)) {
            case Types.VARCHAR:
            case Types.LONGVARCHAR:
            case Types.CHAR:
                System.out.println(resultSet.getString(i));
                break;
            case Types.DOUBLE:
                System.out.println(resultSet.getDouble(i));
                break;
            case Types.INTEGER:
                System.out.println(resultSet.getInt(i));
                break;
            case Types.DATE:
                System.out.println(resultSet.getDate(i).toString());
                break;
            case Types.TIMESTAMP:
                System.out.println(resultSet.getTimestamp(i).toString());
                break;
            case Types.BOOLEAN:
                System.out.println(resultSet.getBoolean(i));
                break;
            case Types.DECIMAL:
            case Types.NUMERIC:
                System.out.println(resultSet.getBigDecimal(i));
                break;
            default:
                System.out.println("This column type (" 
                        + rsmd.getColumnTypeName(i)
                        + ") is currently not supported in method \"printResultColumns\""
                        + ".\nAdd it as case there.");
            }
        }
    }
}

关于java - 通过java执行SQL查询时出现错误 "java.sql.SQLException: Invalid column index",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57178320/

相关文章:

java - 使用 PrintWriter 将 ASCII 代码写入文件

Java Servlet 连接超时

java - 如何等待连接?

用于 Oracle 访问的 Java 代码在执行期间失败。我该如何修复我的代码?

java.sql : Validate ResultSet format

java - 如何使用 JSR 验证来验证 Spring 中的 Controller 方法参数?

java - JDBC 远程 MySQL 连接

oracle - Oracle XA 客户端的 JDBC URL

java - Jetty 6 Eclipse 数据源 NameNotFoundException

java - jetty 不启动