1

6 列と 6 行で構成されるデータベース テーブルがあります。2 行目の 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: 範囲外の文字列インデックス: java.lang.String.substring(String.java:1958) で -1、sun.jdbc.odbc.JdbcOdbcResultSet.reWordAsCountQuery(JdbcOdbcR‌ esultSet. java:6557) で.jdbc.odbc.JdbcOdbcResultSet.calculateRowCount(JdbcOdbcRe‌sultSet.ja ava:6350) at sun.jdbc.odbc.JdbcOdbcResultSet.initialize(JdbcOdbcResultSet‌ .java:154) at 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。これらにより、必要になる前にステートメントを作成し、同じステートメントを何度も再利用することができます。これにより、パフォーマンスがさらに向上し、クエリがユーザー入力を使用する場合のセキュリティ/安全性が向上します。あるポイント ( PreparedStatementSQL インジェクション攻撃を避けるために、入力文字列を自動的にエスケープします)。

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 に答える