2008-08-27 90 views
0

我將以下代碼發佈到Sun開發人員論壇,因爲我認爲這是錯誤的(真正的錯誤是在此代碼被擊中之前)。我收到的一個迴應說不起作用並把它扔掉。但它實際上工作。它可能不是最好的代碼(我是Java新手),但是它有什麼內在的「錯誤」嗎?將CSV導入Access的Java代碼

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

CODE:

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

回答

5

字面上的答案是否定的 - 從來就沒有什麼 「本質錯誤」 的代碼,它是否事它符合要求 - 可能包括也可能不包括可維護,安全,強大或快速的要求。

您正在運行的代碼實際上是純粹在Access中的JET查詢 - Java代碼除了告訴Access運行查詢外什麼都不做。

一方面,如果沒有損壞就不要修復它。另一方面,它很可能會在不久的將來破裂,所以你可以嘗試提前修復它。

它有可能打破這兩個可能的原因是:

  1. SQL注入風險。取決於csvDirPath和csvFileName來自哪裏(例如,csvFileName可能來自用戶上傳的文件的名稱?),以及Access JDBC驅動程序的聰明程度如何,您可以向打開或刪除數據的人開放,方法是插入分號(或用於創建子查詢的一些括號)以及一些額外的SQL命令。
  2. 您正在依賴與Access表的列兼容的CSV文件的列。如果您上傳了未經檢查的CSV,或者CSV生成器具有處理空值的特殊方式,或者您有一天會得到不正常的日期或數字格式,則在插入到Access表格時可能會出現錯誤。

說了這麼多,我們都是在這裏討論實用主義。如果上面的代碼來自您將要每週/每月/每年使用幾次手工工具類的工具類,那麼這不是一個真正的問題。

如果它是構成Web應用程序的一部分的類,那麼執行此操作的'官方'Java方法就是從CSV文件中讀取記錄(使用CSV解析器或CSV /文本JDBC驅動程序),從記錄集中取出列,對它們進行一些驗證或完整性檢查,然後使用新的PreparedStatement將它們插入到Access數據庫中。更麻煩但更強大。

你可能會找到一些工具的組合(例如對象關係層或其他數據訪問工具),這些工具會爲你做很多工作,但是設置工具和編寫代碼一樣麻煩。然後再一次,你會從任何一個學到很多東西。

2

一個字的警告 - jdbc - >訪問查詢(使用odbc橋接)不適用於64位系統,因爲不存在64位Access數據庫驅動程序(該驅動程序包含在Windows的32位副本中並且可以只能通過32位進程訪問,您可以運行「odbcad32」或查看ODBC控制面板以查看驅動程序是否存在)

雖然我在代碼段中看不到帶有連接字符串的代碼,我不知道任何用於Java的非商業Access JDBC驅動程序,只有jdbc-> odbc橋接並依賴Windows才能具有Access(* .mdb)驅動程序。微軟不再支持這個驅動程序,也沒有計劃將其移植到64位,所以基礎架構明智的是它需要考慮。

+0

Access 2010有64位驅動程序。 – Fionnuala 2012-01-19 16:21:16

0

問題約書亞麥金農:

你能提供一個關於MS的計劃從來沒有推出64位ODBC驅動程序的Jet引用?這聽起來很合理,所以我一點也不懷疑你,我只想知道你是否有一個你可以指出的來源。

當然MS 提供通過OLEDB在64位系統上訪問Jet,但是,對不對?這對JDBC沒有幫助,但肯定提供了一種使用Jet數據的方法(它們必須提供某些東西,因爲Jet 4是OS的一部分,因爲它用作Active Directory的數據存儲,因此已被使用自Windows 2000以來)。

1

@ david.w.fenton.myopenid.com:「你能提供一個關於MS計劃不要爲Jet引入64位ODBC驅動程序的引用嗎?」

David,我在微軟的Connect Feedback上找到了一篇關於此的文章。

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

「目前沒有計劃推出的Office團隊JET驅動器的64位版本。我們可能considere備用選項,當我們有一個具體的計劃將更新你。」

謝謝, SSIS團隊。 Microsoft發表於10/3/2007 9:47 PM

微軟在該反饋線程中沒有更新。