java.lang.ArrayIndexOutofBounds异常:2

java.lang.ArrayIndexOutofBounds异常:2,java,Java,我正在尝试将java连接到sql。虽然我是javam的新手,但我似乎不知道为什么 java.lang.ArrayIndexOutOfBoundsException: 2 你能帮我想想怎么解决吗 try{ Connection con = dbConnection(); String lname = this.last.getText(); String fname = this.first.getText(); String mnam

我正在尝试将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);

    }

}

不能设置比查询中的“?”更多的预处理语句属性

“ArrayIndexOutOfBoundsException:2”意味着它在第三个setString时失败(内部数组与所有java数组一样基于零),这是正常的,因为查询中只有两个“?”

编辑:

由于表名中的空格,可能会出现错误。试一试

INSERT INTO [Personal Category]    (Lastname, ...

值()声明中只有两个
。您需要有尽可能多的列名

试一试


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

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

JDBC将每个问号解释为参数的占位符,即程序在准备语句后提供值的承诺。在准备好的语句上调用
setString
setInt
setLong
等时,必须存在相应的编号占位符。否则,将抛出
java.lang.ArrayIndexOutOfBoundsException

您应该拥有与要传递给该INSERT语句的参数数量相同的占位符(

String query = "INSERT INTO PersonalCategory (Lastname, Firstname, Middle, " + 
"Address, Birthday, Age, No, Person) VALUES (?, ?, ?, ?, ?, ?, ?, ?)"
String query=“插入个人类别(姓、名、中、地址、生日、年龄、号码、人)值(?,)”


问题在于要在值中传递的参数数,您只传递了2个参数,而参数数必须是8。

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

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

建议

  • 您正在执行preparedStatement,但未捕获其输出值。它将给您一个布尔值作为输出。然后只有你才能发现什么样的事情被执行了

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

  • 始终关闭final()块内的连接。这样,无论代码是否失败,您都可以确保连接已关闭。通过这样做,不会保持不必要的连接处于打开状态,从而可以顺利地管理数据库


  • 让我们继续使用良好的软件工程概念:)

    是表名“Personal Category”,中间有空格吗?使用调试器逐步完成代码。然后,您将看到它在哪一行失败。我已经更改了值(?,,,,,,,,,,,,,?)。。。虽然它现在说“INSERT INTO语句中的java.sql.SQLException:[Microsoft][ODBC Microsoft Access Driver]语法错误。”还是要感谢您的回复=)我已经更改了值(?,,,,,,,,,,,,?)。。。虽然它现在说“INSERT INTO语句中的java.sql.SQLException:[Microsoft][ODBC Microsoft Access Driver]语法错误。”但还是要感谢您的回复=),表名可能有问题。。中间有一个空间。表名的单词之间不能有空格。检查这个,然后你需要删除它。我已经更改了值(?,,,,,,,,,,,?,,?)。。。尽管它现在说“INSERT INTO语句中的java.sql.SQLException:[Microsoft][ODBC Microsoft Access Driver]语法错误。”仍然要感谢您的回复=),请参阅编辑以了解其他问题。我想你可以用[]来转义带有空格的表名(如果你真的需要一些…)。您可能必须使用
    “个人类别”
    “个人类别”
    String query = "INSERT INTO PersonalCategory (Lastname, Firstname, Middle, " + 
    "Address, Birthday, Age, No, Person) VALUES (?, ?, ?, ?, ?, ?, ?, ?)"