-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" 表示它在第三个 setString 处失败(内部数组与所有 java 数组一样从零开始),这很正常,因为您只有两个 '?' 在查询中。

编辑 :

由于表名中的空格,您可能会遇到错误。尝试

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

?您的声明中只有两个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

你需要更多的问号——准确地说,还有六个。

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

你已经得到了“ArrayIndexOutOfBound”问题的答案。我将回答您的第二个问题“SQLException”并提供一些建议以改进您的代码。

那个 SQLException 正在发生,因为我猜你的表名。您的表名中有 2 个单词,这可能会使编译器感到困惑。

建议

  1. 您正在执行preparedStatement 而不捕获其输出值。它会给你一个布尔值作为输出。然后只有你才能找到执行了什么样的事情。

  2. 在这里,您似乎只是在插入数据,并且您确定您只是在插入数据。因此,如果是,请使用 executeUpdate() 而不是 execute() 方法。

  3. 始终关闭 final() 块内的连接。这样,无论代码是否失败,您都可以始终确保连接已关闭。通过这样做,数据库高峰将得到顺利管理,不会保持不必要的连接打开。

让我们保持良好的软件工程概念:)

于 2012-09-24T17:31:58.270 回答
0

您应该拥有与?传递给该 INSERT 语句的参数数量一样多的占位符 ( )。

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

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

问题在于要在 VALUES 中传递的参数数量,您只传递了 2 个需要 8 个的参数。

于 2012-09-24T16:28:46.040 回答