0

ODBC ドライバーを介して Microsoft Access で Java を使用しています。主キーの重複エントリを挿入すると、エラーが発生します: 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 オブジェクトの形式で返されます。

ステートメントは使用する必要がある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 も)、 ステートメントを実行するために削除する必要があるため、 AccessSyntex エラーが発生します。 Access「データベース」ファイルを使用。DEFAULT NULL

MS Access はユーザーに適していますが、プログラマーとしての私たちには適していません。何も知らないユーザーがこのアプリケーションを使用することを考慮する必要があるため、最善の一般的な方法を見つける必要があります。プログラミング言語やデータベースについて。

じゃあどうすればいいの?

私はデータベースの専門家ではありませんが、次のアドバイスを参考にしてください。

  • アプリケーションでデータベースを共有する必要がある場合:その目的で使用されるMySQL、Oracle、および SQL Server 。
  • アプリケーションが特定の目的にのみ使用され、そのレコードを他のユーザーと共有する必要がない場合は、SQLiteなどの実際のサーバーレス データベース エンジンを使用します。これはAccessのようなファイルであり、Java用の外部ドライバーのみが必要なため、これが最適なオプションのようです。これを参照してください。

Googleで検索すると、SQLiteデータベースを設計するためのFireFox拡張機能があると思います。

于 2013-07-08T18:22:52.450 に答える