插入时的Java常规错误… ???

我试图在MS Access中的表上执行Insert, Update and Delete 。 一切正常

对于SELECT语句。 但是当做其他三个操作时,我似乎没有得到任何操作

错误,但操作不会反映到DB上。 请帮忙…

INSERT声明如下:

 PreparedStatement ps = con.prepareStatement("INSERT INTO Student VALUES (?, ?, ?, ?, ?, ?, ?, ?)"); ps.setInt(1,1); ps.setString(2,"ish"); ps.setInt(3,100); ps.setInt(4,100); ps.setInt(5,100); ps.setInt(6,300); ps.setInt(7,100); ps.setString(8,"A"); ps.executeUpdate(); 

我也可以知道为什么使用PreparedStatement除了SELECT语句…

我收到此错误:

 Exception in thread "main" java.sql.SQLException: General error at sun.jdbc.odbc.JdbcOdbc.createSQLException(JdbcOdbc.java:6986) at sun.jdbc.odbc.JdbcOdbc.standardError(JdbcOdbc.java:7114) at sun.jdbc.odbc.JdbcOdbc.SQLExecute(JdbcOdbc.java:3149) at sun.jdbc.odbc.JdbcOdbcPreparedStatement.execute(JdbcOdbcPreparedState ment.java:216) at sun.jdbc.odbc.JdbcOdbcPreparedStatement.executeUpdate(JdbcOdbcPrepare dStatement.java:138) at Student.main(Student.java:19) 

这是我的代码……

  import java.sql.*; import java.io.*; class Student { public static void main(String args[]) throws SQLException, IOException, ClassNotFoundException { Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); Connection con = DriverManager.getConnection("jdbc:odbc:Student","",""); Statement st = con.createStatement(); PreparedStatement ps = con.prepareStatement("INSERT INTO Student VALUES (?, ?, ?, ?, ?, ?, ?, ?)"); ps.setInt(1,1); ps.setString(2,"Girish"); ps.setInt(3,100); ps.setInt(4,100); ps.setInt(5,100); ps.setInt(6,300); ps.setInt(7,100); ps.setString(8,"A"); ps.executeUpdate(); con.commit(); con.close(); } } 

当您不提交 / 关闭连接时,可能会发生这种情况。 确保在执行语句后提交连接,并在try块的finally块中关闭连接(和语句和结果集),并在这些块中获取并执行它们。

至于为什么使用PreparedStatement ,这是避免SQL注入 攻击的常用方法,并且可以在SQL查询中轻松设置像DateInputStream等完整的Java对象,而无需将它们转换为String

我相信你准备好的陈述格式错误。 INSERT INTO的文档(可在此处获取: http : //msdn.microsoft.com/en-us/library/bb208861 (v = office.12 ) .aspx )给出以下格式:

单记录追加查询:

 INSERT INTO target [(field1[, field2[, …]])] VALUES (value1[, value2[, …]) 

你给出的格式是:

 INSERT INTO target VALUES (value1[, value2[, …]) 

编辑:为了更清楚,我相信你想要的东西:

 PreparedStatement ps = con.prepareStatement("INSERT INTO Student (Year, Name, field3 ...) VALUES (?, ?, ?, ?, ?, ?, ?, ?)"); 

其中Year,Name,field3 …是您要插入的字段的名称。

使用PreparedStatement的主要原因是安全性。 通过查询字符串来生成SQL查询是不安全的,因为变量部分可能包含用户输入的SQL语句。 这将允许向用户执行DROP TABLE *之类的语句(请参阅SQL注入 )。 如果SQL查询不是静态的(doe snot包含可变部分),那么仅使用PreparedStatemnts是个好主意。 因此,最好将PreparedStatement用于SELECT语句。

编辑:

您尝试插入学生主键,如果它是一个标识列,它将无法正常工作。

你需要像这样准备你的陈述:

 PreparedStatement ps = con.prepareStatement("INSERT INTO Student(Field1,Field2,Field3,Field4,Field5,Field6,Field7) VALUES (?, ?, ?, ?, ?, ?, ?)"); 

如果没有您的主键设置,数据库将为您完成。

原帖:

StackOverflow上有一个类似的问题 。

在正确关闭Connection之前,您不会看到来自INSERT查询的任何结果。

您的代码不会关闭任何资源,这肯定会让您感到悲伤。 在finally块中调用close方法(如果有多个,则按相反顺序)。

这是一个DataBaseUtils类,可以在需要时为您提供帮助。

 public class DatabaseUtils { public static Connection createConnection(String driver, String url, String username, String password) throws ClassNotFoundException, SQLException { Class.forName(driver); return DriverManager.getConnection(url, username, password); } public static void close(Connection connection) { try { if (connection != null) { connection.close(); } } catch (SQLException e) { e.printStackTrace(e); } } public static void close(Statement statement) { try { if (statement != null) { statement.close(); } } catch (SQLException e) { e.printStackTrace(e); } } public static void close(ResultSet rs) { try { if (rs != null) { rs.close(); } } catch (SQLException e) { e.printStackTrace(e); } } }