java.sql.SQLException:[Microsoft][ODBC驱动程序管理器]指定的DSN包含驱动程序和应用程序之间的体系结构不匹配

java.sql.SQLException:[Microsoft][ODBC驱动程序管理器]指定的DSN包含驱动程序和应用程序之间的体系结构不匹配,java,jdbc,jdbc-odbc,Java,Jdbc,Jdbc Odbc,以下代码: public void insertNewStudent(int id, String pass, String fname, String lname, String street, String city, String state, int Zip, String Email, double GPA) { try { Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); conn = DriverManager

以下代码:

public void insertNewStudent(int id, String pass, String fname, String lname, String   street, String city, String state, int Zip, String Email, double GPA) {
    try {
    Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
    conn = DriverManager.getConnection("jdbc:odbc:RegistrationDB", "", "");
    String query = "INSERT INTO Students (ID, Password, FirstName, LastName, Street, City, State, Zip, EMail, GPA)" + "VALUES (?,?,?,?,?,?,?,?,?,?)";
    PreparedStatement ps = conn.prepareStatement(query);
    ps.setInt(1, id);
    ps.setString(2, pass);
    ps.setString(3, fname);
    ps.setString(4, lname);
    ps.setString(5, street);
    ps.setString(6, city);
    ps.setString(7, state);
    ps.setInt(8, Zip);
    ps.setString(9, Email);
    ps.setDouble(10, GPA);
    ps.executeUpdate();
    } catch (Exception e) {
        throw new RuntimeException(e);
    }
}
引发以下异常:

java.sql.SQLException: [Microsoft][ODBC Driver Manager] The specified DSN contains an     architecture mismatch between the Driver and Application
    sun.jdbc.odbc.JdbcOdbc.createSQLException(JdbcOdbc.java:6956)
    sun.jdbc.odbc.JdbcOdbc.standardError(JdbcOdbc.java:7113)
    sun.jdbc.odbc.JdbcOdbc.SQLDriverConnect(JdbcOdbc.java:3072)
    sun.jdbc.odbc.JdbcOdbcConnection.initialize(JdbcOdbcConnection.java:323)
    sun.jdbc.odbc.JdbcOdbcDriver.connect(JdbcOdbcDriver.java:174)
    java.sql.DriverManager.getConnection(DriverManager.java:579)
    java.sql.DriverManager.getConnection(DriverManager.java:221)
    business.studentDB.insertNewStudent(studentDB.java:53)
    controller.registercontrol.doPost(registercontrol.java:47)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:641)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
    org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:393)

这是如何导致的,我如何解决它?

添加一个
最后

PreparedStatement ps = null; // declare outside the try block
try {
  // ...
} catch (Exception e) {
  // ...
} finally {
  try {
    if (ps != null) ps.close();
    if (conn != null) conn.close();
  } catch (SQLException e) {
    // ...
  }
}
保持连接处于打开状态可能不会将更改提交到数据库。如果
连接正在被共享,而您无法将其关闭
commit()
则您的更改将显式进行

ps.executeUpdate();
conn.commit();

编辑:根据共享的堆栈跟踪,请确保您的Java IDE、Microsoft Access和JVM或JDK都是相同的位,即32位或64位版本。但是,是的,仍然建议添加
finally
块。

因此更改异常处理会暴露出真正的问题,这似乎是:

The specified DSN contains an architecture mismatch between the Driver and Application

这基本上说明您要么使用32位驱动程序,要么使用64位访问,或者使用其他方式。你需要找出哪个,然后使用正确的。例如,关于这个问题的更多信息。

尝试在查询中留下一个空格字符,如:“插入学生(ID、密码、姓氏、姓氏、街道、城市、州、邮政编码、电子邮件、GPA)”+“值(?,,,,,,,,,,,,,,,,”;刚刚尝试了您的建议@SteliosSavva,但似乎不起作用。您是否尝试过从终端执行查询?这样我们就可以消除查询语法中的错误。另外,我建议您在try-catch语句中使用catch-SQLException。刚刚注意到..删除值之间的空格字符(?,…)我在MS Access中使用MS Access数据库,所以没有。感谢您的建议,我删除了空格和所有内容,但我仍然没有看到反映更改的内容。这里有一个想法,我的表中的“ID”字段是一个索引主键,我是否需要将列名传递到第一个准备好的语句中,因为它是自动索引的?ps.setInt(1,ID)?可能刚发生了一个derp momentChange
catch(异常e){System.out.print(“Error:+e”);}
to
catch(异常e){抛出新的运行时异常(“数据库错误”,e);}
然后看看会发生什么……保持连接打开与问题无关,因为我知道我有64位访问权限和32位Netbeans。我在32ODBC和64ODBC中设置了数据源(就像您链接的帖子一样),但仍然得到了错误。所以我需要强制Netbeans在64中运行?@是的,请检查我的编辑@eis不是
e.printStackTrace()
简单吗?谢谢ravi和eis-我以前遇到过这个问题,现在我想再次这样做,让我的头撞到键盘上。很高兴知道我的实际代码是正确的,尽管(我想)干杯@Ravi OP已经在标准输出中丢失了错误消息,所以我不认为以不同的方式打印它会有什么帮助。应该提出例外情况,而不仅仅是打印出来。