1

我有一个由 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:字符串索引超出范围:-1 at java.lang.String.substring(String.java:1958) at sun.jdbc.odbc.JdbcOdbcResultSet.reWordAsCountQuery(JdbcOdbcR‌​esultSet.java:6557) at sun .jdbc.odbc.JdbcOdbcResultSet.calculateRowCount(JdbcOdbcRe‌​sultSet.j ava: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‌​nt.java:2 53) 在 Router.send(Router1.java:37) 在 Router1.main(Router1.java:54)

4

1 回答 1

2

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

select *from Table1

应该

select * from Table1

*需要在它和from.

此外,值得一提的是,使用 SQL 的最佳做法是让您的关键字全部大写......所以您的语句重新编写如下:

SELECT * FROM Table1

最好的做法是让您的表不以大写字母开头,或者根本不使用大写字母......但是在创建数据库时必须考虑到这一点。

另外,作为学习笔记:

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

另外,值得一提的是,查看PreparedStatement. 这些将允许您在需要它们之前创建语句,然后一遍又一遍地重复使用相同的语句,这将产生更高的性能,并且如果您的查询将使用用户输入,则提供更多的安全性/安全性某些点(PreparedStatement自动转义输入字符串以避免 SQL 注入攻击)。

UPDATE --

一些代码尝试:

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();
    }
}

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

于 2013-09-19T15:18:28.003 回答