插入时出现Java常规错误。。。???
我正试图在MS Access中对表执行插入、更新和删除操作。一切正常 对于插入时出现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");
语句,选择语句。但在做其他三个手术时,我似乎没有得到任何帮助
错误,但操作不会反映到数据库中。请帮忙
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自动编号字段允许插入值,只要它们是正确的数据类型且不与现有值冲突。