java - 使用 ODBC 和 MS Access 时出现主键冲突错误代码

标签 java ms-access odbc primary-key

我通过 ODBC 驱动程序将 Java 与 Microsoft Access 结合使用。当我插入主键的重复条目时,它给出一个错误:java.sql.SQLException:一般错误。我想向用户显示一条消息,表明该记录已存在,但我认为 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)

最佳答案

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

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

既然该语句是 INSERT 语句,则必须使用 executeUpdate(query) ,此方法一般用于 INSERT、UPDATE 和 DELETE 语句。当表更新成功时返回 1。 例如

int result = st.executeUpdate(qry);
System.out.println(result);
<小时/>

更新:

根据评论,我推测您还有另一个问题,而不是 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 上搜索也许你会找到它。

关于java - 使用 ODBC 和 MS Access 时出现主键冲突错误代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17524703/

相关文章:

ms-access - 我可以使用 VBA 将用户添加到 Access,而不是使用内置的用户和组帐户框吗?

MySQL - ODBC 连接失败,Workbench 连接正常

php - 我从 PHP 使用 ODBC 并连接到 Microsoft SQL Server 2008R2 实例时收到 "String data, right truncation"错误

java - Spring Boot get请求未使用@OneToMany获取第三级对象

java - 未创建 AlerDialog - java.lang.IllegalArgumentException : Activity#onCreateDialog did not create a dialog for id X

mysql - 使用 SQL 聚合文本数据

sql - "Compact and repair"操作后 MS Access 查询出现问题

web-services - Hadoop-不带HIVE的带HBASE的ODBC

java - linux 中的 java 版本不正确

java - 如何在 Netsuite ERP 中使用 SOAP Web 服务获取客户列表?