2013-05-07 2 views
0

Код ниже:java.sql.SQLException: [Microsoft] [ODBC Driver Manager] Указанный DSN содержит несоответствие архитектуры между драйвером и применения

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) 

Как это вызвано и как я могу его решить?

+0

Попробуйте оставить символ пробела в вашем запросе следующим образом: «INSERT INTO Students (ID, Password, FirstName, LastName, Street, City, State, Zip, EMail, GPA)» + «VALUES (?,?,? ,,,,,,,) "?????; –

+0

Просто попробовал ваше предложение @SteliosSavva, но это, похоже, не сработало. – drowningincoffee

+0

Вы пытались выполнить запрос с терминала? таким образом мы можем исключить, что ошибка содержится в синтаксисе запроса. Кроме того, я бы порекомендовал в вашем заявлении try-catch, что вы используете catch SQLException. Просто заметили ... удалите пробельный символ между VALUES (?,? ...) –

ответ

1

Таким образом изменив обработку исключений непокрытой вашу реальную проблему, которая кажется:

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

В основном это говорит, что у Вас есть или 32-разрядный драйвер против 64-битного доступа или наоборот. Вам нужно выяснить, какой и использовать правильный. Подробнее об этой проблеме см., Например, this thread.

+0

Я знаю, что у меня 64-битный доступ и 32-битный Netbeans. Я установил источники данных как в 32ODBC, так и в 64ODBC (как и сообщение, которое вы связали), и все еще получите ошибку. Поэтому мне нужно заставить Netbeans работать в 64? – drowningincoffee

+0

@drowningincoffee Да, проверьте мое редактирование! –

+0

@eis не 'e.printStackTrace()' простой? –

1

Добавить finally блок

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) { 
    // ... 
    } 
} 

Оставив Connection открытыми, не может быть обязывающие изменения в базу данных. Если Connection является общим, и вы не можете закрыть его commit() ваши изменения явно.

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

EDIT: В свете трассировки стека поделилась пожалуйста, убедитесь, что ваш Java IDE, Microsoft Access и JVM или JDK все того же бита т.е. 32 или 64-разрядных версий. Но, да, добавление блока finally по-прежнему рекомендуется.

+0

, оставляя открытое соединение, не имеет ничего общего с проблемой OP имеет – eis