【问题标题】:Primary key violation error code using ODBC with MS Access使用 ODBC 和 MS Access 的主键违规错误代码
【发布时间】:2013-07-08 10:47:09
【问题描述】:

我通过 ODBC 驱动程序将 Java 与 Microsoft Access 一起使用。当我为主键插入重复条目时,它给了我一个错误:java.sql.SQLException: General error。我想向用户显示这条记录已经存在的消息,但我认为在其他一些情况下,ODBC 也会抛出这个异常。所以我发现每条消息都有错误代码(ref),但是我没有发现主键违规的错误代码。谁能告诉我使用 MS Access 的 ODBC 主键违规的错误代码是什么?

这是基本代码

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)

【问题讨论】:

  • 请您添加您的代码。
  • 'Azad' 我添加了代码。
  • 查看答案,希望对您有所帮助

标签: java ms-access odbc primary-key


【解决方案1】:

问题出在这一行st.executeQuery(qry);

executeQuery(query)方法主要用于SELECT语句,它以ResultSet对象的形式返回。

如果语句是 INSERT 语句,则必须使用 executeUpdate(query) ,此方法通常用于 INSERT、UPDATE 和 DELETE 语句。当表更新成功时,它返回 1。 例如

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

更新:

由于 cmets,我推测您还有另一个问题,而不是 SQL 语句。在使用 java 到 Ms Access 时必须小心,因为您实际上是在连接到中间件服务器,因此,在运行 SQL 时必须预料到意外的异常 em> 语句,例如:

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

这个查询在 SQLite 和 MySQL 上运行(也许是 SQL Server,因为我没有测试它),在 Access 上给出 Syntex 错误,因为 DEFAULT NULL 应该是为运行该语句而被删除。可能还有许多其他问题您必须准备使用 Access“数据库”文件来面对它。

所以,我告诉你离开它,MS Access 适合它的用户,而不适合我们作为程序员,我们必须找到最好的通用方式,因为我们必须考虑到某些用户使用这个不对编程语言和数据库一无所知

那我该怎么办?

我不是数据库专家,但请听我的建议:

  • 如果您的应用程序需要共享其数据库:MySQL、Oracle 和 SQL Server 用于该目的。
  • 如果您的应用程序仅用于某些目的并且不需要将其记录共享给其他用户,请使用真正的无服务器数据库引擎,例如 SQLite。这似乎是您的最佳选择,因为它是像 Access 这样的文件,只需要 Java 的外部驱动程序,请参阅this

我认为有一个用于设计 SQLite 数据库的 FireFox 扩展,如果你在 google 上搜索也许你会找到它。

【讨论】:

  • 它没有解决问题。当我给出重复的键值时,仍然会发生同样的错误。我的问题是在收到 PK 违规查询时知道 ODBC MS Access 的错误代码是什么。感谢您提到finally,但我已经在使用它,但为了代码简单,我没有在这里写。我正在粘贴完整的堆栈跟踪。可能这有帮助。
  • st.executeUpdate(qry) 如果发现 PK 违规,返回的值是否不是 1?但是我调试了它在到达st.executeUpdate(qry); 语句时跳转到SQLException catch block 的代码。表示此语句正在引发异常。我使用st.executeUpdate(qry) 粘贴了堆栈跟踪
  • 是的,我很困惑,因为你没有提到你的代码是为了演示,这就是我纠正它的原因。
  • 关于general error,很难说是什么导致了这个问题,可能是一些java异常被捆绑并显示为一般错误,或者可能是一个合适的错误。导致此错误的原因很多,有时是数据类型,在您的情况下,重复主键,这就是为什么很难说。
  • 是的,离开 MS-Acees,如果你的应用程序很大,使用 MySQL,否则使用 SQLite 数据库。更多详情见this question的回答。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-24
  • 1970-01-01
  • 1970-01-01
  • 2020-02-23
  • 2012-04-27
相关资源
最近更新 更多