插入时出现Java常规错误。。。???

插入时出现Java常规错误。。。???,java,ms-access,jdbc,Java,Ms Access,Jdbc,我正试图在MS Access中对表执行插入、更新和删除操作。一切正常 对于语句,选择语句。但在做其他三个手术时,我似乎没有得到任何帮助 错误,但操作不会反映到数据库中。请帮忙 INSERT语句如下: PreparedStatement ps = con.prepareStatement("INSERT INTO Student VALUES (?, ?, ?, ?, ?, ?, ?, ?)"); ps.setInt(1,1); ps.setString(2,"ish");

我正试图在MS Access中对表执行插入、更新和删除操作。一切正常

对于
语句,选择
语句。但在做其他三个手术时,我似乎没有得到任何帮助

错误,但操作不会反映到数据库中。请帮忙

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();
我还想知道为什么除了SELECT语句外,还使用了
PreparedStatement

我得到这个错误:

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查询中设置完整的Java对象,如
Date
InputStream
,等等,而无需将它们转换为
String
,,如果不连接,则会发生这种情况。确保在执行语句后提交连接,并在获取和执行连接的
try
块的
finally
块中关闭连接(以及语句和结果集)


至于为什么使用
PreparedStatement
,常用的方法是避免和简化在SQL查询中设置完整的Java对象,如
Date
InputStream
,等等,而无需将它们转换为
String
,使用PreparedStatement的主要原因是安全性。通过关联字符串生成SQL查询是不安全的,因为变量部分可能包含用户输入的SQL语句。这将允许向用户执行DROP TABLE*之类的语句(请参阅)。如果SQL查询不是静态的(不包含可变部分),那么最好只使用PreparedStatements。
因此,最好对SELECT语句使用PreparedStatement。

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

我认为您准备的语句格式错误。INSERT INTO(可在此处找到:)的文档提供了以下格式:

单记录追加查询:

您可以提供以下格式:

INSERT INTO target VALUES (value1[, value2[, …])
编辑: 更清楚地说,我相信你想要的是:

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

其中年份、名称、字段3。。。是您试图插入的字段的名称。

我认为您准备的语句格式错误。INSERT INTO(可在此处找到:)的文档提供了以下格式:

单记录追加查询:

您可以提供以下格式:

INSERT INTO target VALUES (value1[, value2[, …])
编辑: 更清楚地说,我相信你想要的是:

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

其中年份、名称、字段3。。。是您试图插入的字段的名称。

编辑:

您尝试插入学生主键,如果它是标识列,它将不起作用

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

PreparedStatement ps = con.prepareStatement("INSERT INTO Student(Field1,Field2,Field3,Field4,Field5,Field6,Field7) VALUES (?, ?, ?, ?, ?, ?, ?)");
如果没有您的主键集,DB将为您执行此操作

原创帖子:

有一个问题

在正确关闭连接之前,您不会看到使用Access插入查询的任何结果

你的代码没有关闭任何资源,这肯定会给你带来痛苦。在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);
        }
    }
}

编辑:

您尝试插入学生主键,如果它是标识列,它将不起作用

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

PreparedStatement ps = con.prepareStatement("INSERT INTO Student(Field1,Field2,Field3,Field4,Field5,Field6,Field7) VALUES (?, ?, ?, ?, ?, ?, ?)");
如果没有您的主键集,DB将为您执行此操作

原创帖子:

有一个问题

在正确关闭连接之前,您不会看到使用Access插入查询的任何结果

你的代码没有关闭任何资源,这肯定会给你带来痛苦。在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);
        }
    }
}

@El Classico:编辑了我的帖子以帮助您处理您的异常。@Lagrandmile:甚至删除了主键。。并试图插入完全不同的值。。。我更新了。。但这并没有反映在我的数据库中。。但如果在此之后执行SELECT,我会得到数据库中不存在的值,即更新后的值……您是否在我和Lagrandmile的帖子中尝试过将字段名包含在您准备的语句中的建议?@El Classico:编辑我的帖子以帮助您处理异常。@Lagrandmile:甚至删除了主键。。并试图插入完全不同的值。。。我更新了。。但这并没有反映在我的数据库中。。但如果我在那之后执行选择,我会得到数据库中没有的值,即更新的值…你在我和LaGrandMere的帖子中都尝试过在你准备的陈述中包含字段名的建议吗?我不知道原始提问者在PK值方面实际需要什么,但是Jet/ACE自动编号字段允许插入值,只要它们是正确的数据类型并且与现有值不冲突。我不知道原始提问者在PK值方面实际需要什么,但Jet/ACE自动编号字段允许插入值,只要它们是正确的数据类型且不与现有值冲突。