【问题标题】:SQL, JDBC "Invalid column index" error with simple query简单查询的 SQL、JDBC “无效列索引”错误
【发布时间】:2015-01-12 20:21:47
【问题描述】:

我是 STRUTS 和 JDBC 的新手,我的应用程序尝试连接到具有 3 个表的简单数据库,现在所做的只是尝试查询 1 个仅存储“名字、姓氏和 Id 字段”的表

System.out.println("-------- Oracle JDBC Connection Testing ------");

            try {
                Class.forName("oracle.jdbc.driver.OracleDriver");
            } catch (ClassNotFoundException e) {
                System.out.println("Where is your Oracle JDBC Driver?");
                e.printStackTrace();
                return null;
            }

            System.out.println("Oracle JDBC Driver Registered!");

            try {
                connection = 
                    DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:xe","david","changeit");
            } catch (SQLException e) {
                System.out.println("Connection Failed! Check output console");
                e.printStackTrace();
                return null;
            }

            if (connection != null) {
                System.out.println("You made it, take control your database now!");
            } else {
                System.out.println("Failed to make connection!");
            }

如果发生匹配,我想在哪里获得 1 列的结果:

            String sql = "SELECT S_ID FROM Students WHERE firstname=? AND lastname=?";

            PreparedStatement ps = connection.prepareStatement(sql);
            ps.setString(1, firstname);
            ps.setString(2, lastname);

            rs = ps.executeQuery();

            while (rs.next()) {
                studentid = rs.getString(1);
                ret = SUCCESS;
            }
        } catch (Exception e) { ...

据我所知,连接已建立, SQL 查询

Select s_id from Students where firstname='first' and lastname='last';

在 SQL Dev 上运行时。工作并给我一个单一的结果。

我并没有真正得到堆栈跟踪代码只是从 'while (rs.next()) {..' 之前直接跳转到 finally 块

} catch (Exception e) {
        e.printStackTrace();
        ret = ERROR;
    } finally {
        if (connection != null) {
            try {
                connection.close();
            } catch (Exception e) {
            }
        }
    }

【问题讨论】:

  • 第83行是哪一行?
  • hmm 实际上是一个数字,但运行时代码甚至不会进入 while 循环 while (rs.next()) { ...
  • 是的,名字和姓氏已正确填充,我已对其进行了调试。
  • 您是否尝试调试以确保正确填写名字和姓氏?
  • 关于您关于不进入while(rs.next()) 循环的评论,您还从哪里调用getString()?因为这似乎是错误的来源。

标签: java sql jdbc struts2 oracle-sqldeveloper


【解决方案1】:

我不确定 Oracle 驱动程序是如何工作的。但下面的声明是我在 Oracle 网站上看到的。你得到一个非空结果集吗? 由于您在 .next() 上没有收到 nullpointerexception,我想知道 Oracle 驱动程序是否返回一个空的 ResultSet,这可能会导致这个问题。

http://docs.oracle.com/cd/B28359_01/java.111/b31224/getsta.htm

对于标准 JDBC 驱动程序,如果正在执行的 SQL 字符串 不返回 ResultSet 对象,则执行 executeQuery 方法 引发 SQLException 异常。对于 Oracle JDBC 驱动程序, executeQuery 方法不会抛出 SQLException 异常,即使 正在执行的 SQL 字符串不返回 ResultSet 对象。

【讨论】:

  • 我认为这可能是问题所在。查询似乎很好..当我在 SQLdev 上运行它并且连接似乎很好(如果我输入错误的密码它会失败)。我不知道它可能是什么:(
  • 在 SQLDev 上运行时,SQL 是否至少返回单行?请耐心等待,您的代码我没有看到任何问题。你能在 rs = ps.executeQuery(); 处设置一个断点吗?并查看分配给 rs 的值?
  • 是的,我可以,这是该行之前的 ps 状态:i.imgur.com/OUpN64q.png
  • 这里我们可以查看ps>preparedStatement>parameterString:i.imgur.com/N4D3Jn1.png中的名字和姓氏
  • 很高兴我能帮上忙。如果可能,请在此处添加您的发现。它可能会帮助其他人。
【解决方案2】:

就像我说的那样,我是新手。 问题是我的架构没有分配 CONNECT 角色。

解决方案以“SYSTEM”身份登录并将角色授予我的架构

grant connect to MY_SCHEMA;

【讨论】:

  • 很高兴你知道了!
猜你喜欢
  • 2021-08-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多