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

时间:2011-01-03 13:48:27

标签: java ms-access jdbc

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

4 个答案:

答案 0 :(得分:3)

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

至于使用PreparedStatement的原因,这是避免SQL injection attacks的常用方法,并且可以轻松设置像DateInputStream等值得称道的Java对象在SQL查询中等,而无需将它们转换为String

答案 1 :(得分:1)

我相信你准备好的陈述格式错误。 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 ...是您要插入的字段的名称。

答案 2 :(得分:0)

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

答案 3 :(得分:0)

修改:

您尝试插入学生主键,如果它是标识列,则无效。

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

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

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

原帖:

kind of similar question on 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);
        }
    }
}