0

我通过 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)
4

1 回答 1

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);

更新:

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

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

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

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

那么,我该怎么办?

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

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

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

于 2013-07-08T18:22:52.450 回答