-1

JavaをSQLに接続しようとしています。私はjavamの初心者ですが、その理由がわかりません。

java.lang.ArrayIndexOutOfBoundsException: 2 

私を助けて、それを理解する方法を教えてもらえますか?

try{
       Connection con = dbConnection();

       String lname = this.last.getText();
       String fname = this.first.getText();
       String mname = this.mid.getText();
       String ad = this.add.getText();
       String bd = this.bday.getText();
       String ag = this.edad.getText();
       String nom = this.no.getText();
       String per = this.person.getText();

       String query = "INSERT INTO Personal Category    (Lastname,Firstname,Middle,Address,Birthday,Age,No,Person) VALUES (?,?)"; //to insert to database

       PreparedStatement pre;

       pre = con.prepareStatement(query);


       pre.setString(1, lname);
       pre.setString(2, fname);
       pre.setString(3, mname);
       pre.setString(4, ad);
       pre.setString(5, bd);
       pre.setString(6, ag);
       pre.setString(7, nom);
       pre.setString(8, per);


       pre.execute();//execute

       con.close();


    }catch (Exception e){

        System.out.println(e);

    }

}
4

6 に答える 6

5

'?' より多くのプリペアド ステートメント プロパティを設定することはできません。あなたのクエリで。

「ArrayIndexOutOfBoundsException: 2」は、3 番目の setString (内部配列はすべての Java 配列と同様にゼロから始まる) で失敗することを意味します。クエリで。

編集 :

テーブル名のスペースが原因でエラーが発生する可能性があります。試してみてください

INSERT INTO [Personal Category]    (Lastname, ...
于 2012-09-24T16:23:46.870 に答える
3

宣言?には2つしかありません。VALUES()列名と同じ数だけ持つ必要があります。

試す

String query = "INSERT INTO Personal Category    (Lastname,Firstname,Middle,Address,Birthday,Age,No,Person) VALUES (?,?,?,?,?,?,?,?)"; //to insert to database
于 2012-09-24T16:24:08.677 に答える
1

より多くの疑問符が必要です。正確には、さらに6つです。

String query = "INSERT INTO Personal Category    (Lastname,Firstname,Middle,Address,Birthday,Age,No,Person) VALUES (?,?,?,?,?,?,?,?)";

JDBCは、各疑問符をパラメーターのプレースホルダーとして解釈します。つまり、ステートメントの準備後に値を提供するというプログラムによる約束です。プリペアドステートメントで、、、などを呼び出すときは、対応する番号付きプレースホルダーが存在する必要がsetStringありsetIntます。setLongそれ以外の場合は、java.lang.ArrayIndexOutOfBoundsExceptionがスローされます。

于 2012-09-24T16:24:11.303 に答える
0

String query = "INSERT INTO Personal Category (Lastname,Firstname,Middle,Address,Birthday,Age,No,Person) VALUES (?,?)";

問題は、VALUESで渡される引数の数にあります。8である必要がある場合、 2つの引数のみを渡しています。

于 2012-09-24T16:28:46.040 に答える
0

?そのINSERTステートメントに渡されるパラメーターの数と同じ数のプレースホルダー()が必要です。

String query = "INSERT INTO PersonalCategory (Lastname, Firstname, Middle, " + 
"Address, Birthday, Age, No, Person) VALUES (?, ?, ?, ?, ?, ?, ?, ?)"
于 2012-09-24T16:26:38.703 に答える
0

「ArrayIndexOutOfBound」の問題に対する答えがあります。2 番目の質問「SQLException」にお答えし、コードを改善するためのアドバイスをします。

テーブル名が推測されるため、その SQLException が発生しています。テーブル名に 2 つの単語が含まれているため、コンパイラが混乱する可能性があります。

アドバイス

  1. 出力値を取得せずに、preparedStatement を実行しています。出力としてブール値が得られます。そうすれば、どのようなことが実行されたかを知ることができるのはあなただけです。

  2. ここでは、データの挿入のみを行っているように見えますが、データの挿入のみを行っていることは確かです。その場合は、execute() メソッドではなく executeUpdate() を使用してください。

  3. 常に final() ブロック内で接続を閉じます。このようにして、コードが失敗したかどうかに関係なく、接続が閉じられていることを常に確認できます。こうすることで、不要な接続を開いたままにしないことで、データベース ラッシュがスムーズに管理されます。

優れたソフトウェア エンジニアリングの概念を維持しましょう :)

于 2012-09-24T17:31:58.270 に答える