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 momentChangecatch(异常e){System.out.print(“Error:+e”);}
tocatch(异常e){抛出新的运行时异常(“数据库错误”,e);}
然后看看会发生什么……保持连接打开与问题无关,因为我知道我有64位访问权限和32位Netbeans。我在32ODBC和64ODBC中设置了数据源(就像您链接的帖子一样),但仍然得到了错误。所以我需要强制Netbeans在64中运行?@是的,请检查我的编辑@eis不是e.printStackTrace()
简单吗?谢谢ravi和eis-我以前遇到过这个问题,现在我想再次这样做,让我的头撞到键盘上。很高兴知道我的实际代码是正确的,尽管(我想)干杯@Ravi OP已经在标准输出中丢失了错误消息,所以我不认为以不同的方式打印它会有什么帮助。应该提出例外情况,而不仅仅是打印出来。