0

エラーだと思ったので、以下のコードを Sun 開発者フォーラムに投稿しました (本当のエラーは、このコードがヒットする前でした)。私が得た応答の 1 つは、それが機能しないと言って、それを捨てることでした。しかし、それは実際に機能しています。それは最良のコードではないかもしれません (私は Java を初めて使用します)。

=============

コード:

private static void ImportFromCsvToAccessTable(String mdbFilePath, String accessTableName , String csvDirPath , String csvFileName ) throws ClassNotFoundException, SQLException { Connection msConn = getDestinationConnection(mdbFilePath); try{ String strSQL = "SELECT * INTO " + accessTableName + " FROM [Text;HDR=YES;DATABASE=" + csvDirPath + ";].[" + csvFileName + "]"; PreparedStatement selectPrepSt = msConn.prepareStatement(strSQL ); boolean result = selectPrepSt.execute(); System.out.println( "result = " + result ); } catch(Exception e) { System.out.println(e); } finally { msConn.close(); } }
4

4 に答える 4

6

文字通りの答えはノーです-コードに「本質的に間違っている」ことは決してありません。それは要件を満たしているかどうかの問題です-それは保守可能、安全、堅牢、または高速であることを含む場合と含まない場合があります。

実行しているコードは、実際には純粋にAccess内のJETクエリです。Javaコードは、Accessにクエリを実行するように指示する以外は何もしていません。

一方では、それが壊れていない場合は、それを修正しないでください。一方で、近い将来壊れてしまう可能性が高いので、事前に修正してみてください。

破損する可能性のある2つの理由は次のとおりです。

  1. SQLインジェクションのリスク。csvDirPathとcsvFileNameがどこから来ているか(たとえば、csvFileNameはユーザーによってアップロードされたファイルの名前から来ている可能性がありますか?)、およびAccess JDBCドライバーがどれほど賢いかによって、誰かがデータを挿入または削除することを受け入れる可能性があります。セミコロン(またはサブクエリを作成するためのいくつかの角かっこ)といくつかの追加のSQLコマンドをクエリに追加します。
  2. CSVファイルの列がAccessテーブルの列と互換性があることに依存しています。アップロード中のCSVのチェックを外した場合、CSVジェネレーターにnullを処理する特定の方法がある場合、またはある日異常な日付または数値形式を取得した場合、Accessテーブルへの挿入時にエラーが発生する可能性があります。

そうは言っても、ここではすべて実用主義についてです。上記のコードが、週/月/年/これまでに数回手動で使用するユーティリティクラスからのものである場合、それは実際には問題ではありません。

それがWebアプリケーションの一部を形成するクラスである場合、それを行うための「公式の」Javaの方法は、CSVファイルからレコードを読み取ることです(CSVパーサーまたはCSV /テキストJDBCドライバーのいずれかを使用)。レコードセットから列を取り出し、それらに対して検証または健全性チェックを実行してから、新しいPreparedStatementを使用してそれらをAccessデータベースに挿入します。はるかに多くの問題がありますが、はるかに堅牢です。

おそらく、多くのことを行うツールの組み合わせ(たとえば、オブジェクトリレーショナルレイヤーやその他のデータアクセスツール)を見つけることができますが、ツールのセットアップは、コードの記述と同じくらい面倒です。次に、どちらかから多くのことを学びます。

于 2008-08-27T17:51:23.030 に答える
2

警告の一言--jdbc->アクセスクエリ(odbcを使用してブリッジする)は、64ビットAccessデータベースドライバーが存在しないため、64ビットシステムでは機能しません(ドライバーはWindowsの32ビットコピーに含まれており、 32ビットプロセス。「odbcad32」を実行するか、ODBCコントロールパネルを見て、ドライバーが存在することを確認できます)

コードスニペットに接続文字列を含むコードは表示されませんが、Java用の非商用のAccess JDBCドライバーは認識していません。ただ、jdbc-> odbcブリッジを使用し、Windowsに依存してAccess(* .mdb)ドライバーを使用しています。 。Microsoftはこのドライバーをサポートしなくなり、64ビットに移植する予定もありません。そのため、インフラストラクチャに関しては、検討する必要があります。

于 2008-08-28T03:32:11.120 に答える
1

@david.w.fenton.myopenid.com: 「Jet 用の 64 ビット ODBC ドライバーを決して導入しないという MS の計画について引用できますか?」

David さん、Microsoft の Connect Feedback で、それに関する投稿を見つけました。

http://connect.microsoft.com/SQLServer/feedback/ViewFeedback.aspx?FeedbackID=125117

「現時点では、Office チームが JET ドライバーの 64 ビット バージョンを出荷する予定はありません。別のオプションを検討する可能性があり、具体的な計画ができたらお知らせします。」

ありがとう、SSIS チーム。Microsoft によって 2007 年 10 月 3 日午後 9 時 47 分に投稿されました。

そのフィードバック スレッドには Microsoft からの更新はありません。

于 2008-09-19T17:46:46.817 に答える
0

ジョシュア・マッキノンへの質問:

Jet 用の 64 ビット ODBC ドライバを導入しないという MS の計画について引用できますか? これは理にかなっているように聞こえるので、私はあなたを疑っているわけではありません。

確かに、MSOLEDB を介して 64 ビット システムで Jet へのアクセスを提供していますよね? これは JDBC には役に立ちませんが、確かに Jet データを使用する方法を提供します (Jet 4 は OS の一部であり、Active Directory のデータ ストアとして使用され、そのように使用されているため、何かを提供する必要があります)。 Windows 2000 以降)。

于 2008-09-15T22:39:30.213 に答える