我正在尝试在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();
}
}
答案 0 :(得分:3)
当您没有commit / close连接时,可能会发生这种情况。确保在执行语句后提交连接,并关闭finally
块中已获取并执行它们的try
块中的连接(和语句和结果集)。
至于使用PreparedStatement
的原因,这是避免SQL injection attacks的常用方法,并且可以轻松设置像Date
,InputStream
等值得称道的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);
}
}
}