2013-07-08 59 views
0

我通過ODBC驅動程序使用Java與Microsoft Access。當我爲主鍵插入重複條目時,它給我一個錯誤:java.sql.SQLException: General error。我想向用戶顯示一條消息,表明這條記錄已經存在,但我認爲這個異常也可以由ODBC在其他一些情況下拋出。所以我發現每條消息都有錯誤代碼(ref),但我沒有發現主鍵違例的錯誤代碼。任何人都可以告訴我哪些錯誤代碼是用於MS Access的ODBC的主鍵違例?使用ODBC與MS Access的主鍵違規錯誤代碼

這是基本的代碼

String qry = "INSERT INTO customers VALUES ('" + txtReg.getText() 
      + "' ,'" + txtName.getText() + "', '" + txtCity.getText() + "' ,'" + txtCell.getText() + "')"; 

try { 

    Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); 
    Connection con = DriverManager.getConnection("jdbc:odbc:MyDB"); 

    Statement st = con.createStatement(); 
    st.executeQuery(qry); 
    st.close(); 
    con.close(); 

} catch (ClassNotFoundException ex) { 
    JOptionPane.showMessageDialog(this, "Error: " + ex, "Error!", JOptionPane.ERROR_MESSAGE); 
} catch (SQLException ex) { 
    JOptionPane.showMessageDialog(this, "Error: " + ex, "Error!", JOptionPane.ERROR_MESSAGE); 
} 

這些txtName等是JTextFields。下面是完整的堆棧跟蹤

connected 
st created 

Error code: 0 
SQLState: S1000 
Messsage: General error 

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.SQLExecDirect(JdbcOdbc.java:3110) 
    at sun.jdbc.odbc.JdbcOdbcStatement.execute(JdbcOdbcStatement.java:338) 
    at sun.jdbc.odbc.JdbcOdbcStatement.executeUpdate(JdbcOdbcStatement.java:288) 
    at gui.InsertFileCode.btnInsertActionPerformed(insertFileCode.java:399) 
+0

請問您可以添加您的代碼。 – Azad

+0

'Azad'我添加了代碼。 –

+0

看到答案,希望它有幫助 – Azad

回答

3

的問題是在這條線st.executeQuery(qry);

executeQuery(query)方法大多用於SELECT語句,它返回的ResultSet對象的形式。

Sence的聲明是INSERT語句,你必須使用executeUpdate(query),這種方法一般由INSERT,UPDATE和DELETE語句使用。當表更新成功則返回1 例如

int result = st.executeUpdate(qry); 
System.out.println(result); 

UPDATE:

由於意見,我fegured出你有另外一個問題,而不是SQL語句。你必須小心使用的java到MS Access的時候,你實際上連接到中間件服務器,這樣,你必須想到未預期的例外(S)在運行SQL 聲明,例如:

CRATE TABLE FOO (ID varchar (50) NOT NULL , NAME varchar (255) DEFAULT NULL)

此查詢的SQLite和MySQL的運行(也許SQL服務器過,因爲我沒有測試),即送了Syntex錯誤訪問,作爲DEFAULT NULL應該運行statement.A次也許有被移除使用Access「數據庫」文件面臨的許多其他問題。所以,我告訴你離開它,MS Access適合它的用戶,而不是我們作爲程序員,我們必須找到最好的方法,因爲我們必須考慮到某些用戶使用這個應用程序,不懂任何關於編程語言和數據庫

那麼,我該怎麼辦?

我不是在數據庫方面的專家,但把我的意見:

  • 如果您的應用程序需要共享其數據庫:用於這一目的的MySQL,Oracle和SQL Server
  • 如果您的應用程序只用於某些目的,而不是需要共享其記錄到其他用戶,使用實際無服務器數據庫引擎如SQLite的。這對你來說似乎是最好的選擇,因爲它像Access這樣的文件,只需要Java的外部驅動程序,請參閱this

我認爲如果你在google上搜索,你可能會發現它有一個用於設計SQLite數據庫的FireFox擴展。

+0

它沒有解決問題。當我給出重複的鍵值時,仍會出現相同的錯誤。我的問題是當它收到PK違例查詢時,知道ODBC MS Access的錯誤代碼是什麼。感謝提到'終於',但我已經在使用這個,但我沒有在這裏寫代碼簡單。我正在粘貼完整的堆棧跟蹤。可能這是有幫助的。 –

+0

如果st.executeUpdate(qry)發現PK衝突,它會返回1以外的值嗎?但是,我調試了它在到達'st.executeUpdate(qry);'語句時跳轉到'SQLException catch catch'的代碼。意味着這個聲明拋出了異常。我使用'st.executeUpdate(qry)'粘貼堆棧跟蹤' –

+0

是的,我很困惑,因爲你沒有提到你的代碼是爲了演示,所以我糾正它。 – Azad