Java jdbc编程中的字符串索引超出范围异常

Java jdbc编程中的字符串索引超出范围异常,java,ms-access,resultset,jdbc-odbc,Java,Ms Access,Resultset,Jdbc Odbc,我有一个由6列6行组成的数据库表。我想访问第二行的所有6列值,但我无法理解为什么会出现此异常 public void send() { int row=2; try { Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); Connection cn=DriverManager.getConnection("jdbc:odbc:DSN2"); Statement st=cn.createStatement(Resul

我有一个由6列6行组成的数据库表。我想访问第二行的所有6列值,但我无法理解为什么会出现此异常

public void send()
{
int row=2;
    try
    {
    Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
    Connection cn=DriverManager.getConnection("jdbc:odbc:DSN2");
    Statement st=cn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);
    ResultSet rs=st.executeQuery("select *from Table1");
    rs.absolute(row);
    System.out.println(rs.getInt(1)+"\t"+rs.getInt(2)+"\t"+rs.getInt(3)+"\t"+rs.getInt(4)+"\t"+rs.getInt(5)+"\t"+rs.getInt(6));

    }

java.lang.StringIndexOutOfBoundsException:字符串索引超出范围:sun.jdbc.odbc.JdbcOdbcResultSet.reWordAsCountQuery(JdbcOdbcR)的java.lang.String.substring(String.java:1958)处为-1‌​java:6557),位于sun.jdbc.odbc.JdbcOdbcResultSet.calculateRowCount(JdbcOdbcRe‌​sultSet.java:6350),位于sun.jdbc.odbc.JdbcOdbcResultSet.initialize(JdbcOdbcResultSet‌​.java:154),位于sun.jdbc.odbc.JdbcOdbcStatement.getResultSet(JdbcOdbcStateme‌​nt.java:4 23),位于sun.jdbc.odbc.JdbcOdbcStatement.executeQuery(JdbcOdbcStateme‌​在Router1.main(Router1.java:54)上发送(Router1.java:37)


您的SQL语句无效,可能导致问题(假设您粘贴在OP中的内容是您真正使用的内容)

应该是

select * from Table1
*
中的
之间需要有一个空格

另外,值得一提的是,SQL的最佳实践是使关键字全部大写。。。因此,您的声明被改写为:

SELECT * FROM Table1
另外,最好的做法是让你们的表格不以大写字母开头,或者根本不带大写字母。。。但是,在创建数据库时,必须对此进行深入研究

此外,作为学习笔记:

您当前的方法将在每次运行此方法时打开新的数据库连接。。。如果经常调用此方法,将导致严重的性能瓶颈/问题。相反,最好在程序启动时打开连接,然后可以反复使用相同的连接来运行语句,然后在程序终止时,让它关闭数据库连接。这消除了与数据库通信时的大量网络活动/开销,并将产生更好的性能和代码的可伸缩性

另外,值得一提的是,查看
PreparedStatement
。这将允许您在需要语句之前创建语句,然后反复使用相同的语句,这将产生更高的性能,并且如果您的查询将在某个时候使用用户输入,那么将提供更高的安全性(
PreparedStatement
自动转义输入字符串以避免SQL注入攻击)

更新--

要尝试的一些代码:

public void send() {

    try {
        Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
        Connection cn=DriverManager.getConnection("jdbc:odbc:DSN2");
        Statement st=cn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);
        ResultSet rs=st.executeQuery("SELECT * FROM Table1");

        // debug section
        ResultSetMetaData rsmd = rs.getMetaData();
        System.out.println("DEBUG: Number of columns = " + rsmd.getColumnCount());
        // end debug

        while(rs.next()) {
            System.out.println(rs.getInt(1)+"\t"+rs.getInt(2)+"\t"+rs.getInt(3)+"\t"+rs.getInt(4)+"\t"+rs.getInt(5)+"\t"+rs.getInt(6));
        }

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

这将打印一行,告诉我们您的
结果集中有多少列

您可以发布异常堆栈跟踪吗?哪一行正在引发异常?我看到的唯一一行可以引发该异常no将是他的
System.out.println()
尝试从行的列中读取数据的语句…java.lang.StringIndexOutOfBoundsException:字符串索引超出范围:-1位于sun.jdbc.odbc.odbc.jdbcResultSet.reWordAsCountQuery(jdbcResultSet.java:6557)位于sun.jdbc.odbc.jdbcResultSet.calculateRowCount(JdbcOdbcResultSet.java:6350)在sun.jdbc.odbc.JdbcOdbcResultSet.initialize(JdbcOdbcResultSet.java:154)在sun.jdbc.odbc.jdbc.JdbcOdbcStatement.getResultSet(JdbcOdbcStatement.java:423)在sun.jdbc.odbc.JdbcOdbcStatement.executeery(JdbcOdbcStatement.java:253)在Router1.main(Router1.java:54)上发送(Router1.java:37)@SnakeDoc S prinln语句读取列值我有6列,为什么exception@Intriguing查看我的最新更新,了解一些代码。我们热烈欢迎您的建议。我按照您所说的做了相应的操作,但错误仍然存在。
ResultSet
中确实没有那么多列,而不是
SELECT*FROM
查询,可能尝试选择单个列——如果您尝试
选择表中不存在的列,JDBC驱动程序将抛出不同的异常。因此,例如:
从表1中选择columnName1、columnName2、columnName3、columnName4;
等等,而不是尝试
rs.absolute(2)
,intead尝试使用
rs.next()将光标向前移动一行
将返回
false
如果没有更多的行…并且尝试从不存在的行中读取将引发与您看到的类似的异常。@有趣的尝试我的帖子中的最新更新。我稍微修改了您的代码,修复了无效的sql语句,并删除了
.absolute()
调用并替换为
.next()
。还添加了一个调试部分,该部分将告诉我们查询返回了多少列,希望在抛出异常并崩溃之前。-可能有助于了解发生了什么错误。是的,问题已解决。因此,我做出了select语句并获得了输出。感谢您。
public void send() {

    try {
        Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
        Connection cn=DriverManager.getConnection("jdbc:odbc:DSN2");
        Statement st=cn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);
        ResultSet rs=st.executeQuery("SELECT * FROM Table1");

        // debug section
        ResultSetMetaData rsmd = rs.getMetaData();
        System.out.println("DEBUG: Number of columns = " + rsmd.getColumnCount());
        // end debug

        while(rs.next()) {
            System.out.println(rs.getInt(1)+"\t"+rs.getInt(2)+"\t"+rs.getInt(3)+"\t"+rs.getInt(4)+"\t"+rs.getInt(5)+"\t"+rs.getInt(6));
        }

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