2

既存のプログラムを JDBC-ODBC Bridge から UCanAccess に変換しています。それは何年も働いています。Java プログラムは MDB ファイルに書き込みます。変換後、1 つの挿入コマンドが機能しなくなりました。
「net.ucanaccess.jdbc.UcanaccessSQLException: 予期しないトークン: [」がスローされます。

いくつかの実験の後、名前にアポストロフィを含む 3 つの列が問題の原因であると判断しました。例: [Sched'd PO Place Date]。どうやら JDBC-ODBC ブリッジは気にしませんでしたが、UCanAccess は気にします。

既存の MDB 構造にとらわれているか、単純にフィールドの名前を変更します。しかし、それを行った場合にダウンストリーム レポートがどれだけ破損する可能性があるかはわかりません。MDB はアドホック レポートに使用されます。

これは、問題の単純化された SQL Select バージョンです。Insert と同じエラーがスローされます。

    String cJD = "net.ucanaccess.jdbc.UcanaccessDriver";
    String cS = "jdbc:ucanaccess://C:/MosAll/mosall.mdb";
    String uid = "";
    String pw = "";
    String sql4 =   "select [Sched'd PO Place Date] from [Tier 1] ";

    Class.forName(cJD);
    Connection con = DriverManager.getConnection(cS, uid, pw);
    PreparedStatement pstmt4;
    pstmt4 = con.prepareStatement(sql4);
    pstmt4.execute();

アポストロフィを「エスケープ」する方法や、ドライバーがアポストロフィを実行できるように ucanaccess を再構成する方法はありますか?

4

2 に答える 2

1

この問題は、UCanAccess 2.0.9.4 で修正されました。


以前の回答:

UCanAccess バージョン 2.0.9.3 で問題を再現できました。

select [Sched'd PO Place Date] ...

失敗しますが、今のところ単に省略しています'

select [Schedd PO Place Date] ...

正常に動作します。興味深いことに、角かっこの代わりにバッククォートを使用する

select `Sched'd PO Place Date` ...

例外も生成します

net.ucanaccess.jdbc.UcanaccessSQLException: 予期しないトークン: [

運が良ければ、これは UCanAccess の将来のリリースで修正される予定です。

于 2015-02-26T12:55:09.963 に答える
0

``(アポストロフィではなく ~ の隣にあるもの) の間のテーブル、カラム名を試しましたか?

String sql4 = "select [Sched\'d PO Place Date] from [Tier 1] { escape '\'}"

[] の代わりに ``を使用して上記のものを試してみることもできます。

最後に、最後のリソースは「select *」で、正しい列を自分で抽出します

于 2015-02-26T00:06:51.430 に答える