java.lang.ArrayIndexOutofBounds异常:2
我正在尝试将java连接到sql。虽然我是javam的新手,但我似乎不知道为什么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.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 (?, ?, ?, ?, ?, ?, ?, ?)"