2008-10-06 56 views
1

我目前正在嘗試將分號分隔的文本文件導入c#中使用OleDb的數據庫,其中我不知道類型(SQL Server,Access,Oracle,MySQL,postgreSQL等等)目前,我正在使用Jet文本閱讀器作爲數據庫讀取文件,然後創建一個準備好的插入語句,填充字段,然後在最後提交。雖然這是有效的,但速度很慢,對於數百萬行,這需要太長時間。使用SQL將文本文件導入到通用數據庫中

所以我的問題:有沒有人有任何其他想法如何最好地將文本文件導入到通用數據庫,或評論我的方法,這將導致更快的導入?

我不能使用第三方庫或軟件來做到這一點,因爲它是一個大項目

+0

你在哪裏特別有問題?這個問題很普遍。沒有密鑰合併數據的問題?或者是使用數據集的機制的問題。另外 - 不知道你的意思是加載一個空的數據庫到數據集。 – Ken 2008-10-06 20:10:46

+0

我試圖找出從文本中獲取數據到數據庫中的最佳方式,但我不知道其類型。如果合併是最好的方法,那麼如何在沒有密鑰的情況下完成。 – Fry 2008-10-06 20:30:25

回答

-1

最好的辦法是買一個現成的應用程序這樣做的部分。

專業Off The Shelf應用程序使用本地驅動程序,並對每種類型的數據源進行微調,以防止它們碰到。這總是在掩護下,所以你看不到它是如何去做的。例如,批量複製用於對付SQL Server; Oracle有一個數據泵。

滾動你自己的問題是,你可以花錢來調整你的應用程序以適應你可能遇到的每種源類型,或者你使用通用的ODBC/ADO /無論是什麼驅動程序。

在一天結束時,您最好將產品從產品中取出,或者只是處理您不得不採取的緩慢方法。在這種情況下,這意味着對所有內容使用單個插入語句

那麼,您對開發資源有多少錢?

+0

不幸的是,這是一個更大的程序的藥水,所以這不是一個選項 – Fry 2008-10-06 20:07:51

+0

看到我的評論Irongoofy,我其實是這樣做,但這是一個全面的,我試圖讓它更快 – Fry 2008-10-07 02:21:39

1

試試這個

http://filehelpers.sourceforge.net

....爲什麼你想在數據庫加載到數據集?讓另一個數據庫跟蹤唯一性(如果有這樣的詞)。在導入時,檢查日誌數據庫中是否存在,如果不存在,則加載到通用數據庫。

等待對此主題的其他回覆,我們可能會有更好的主意。

+0

我想加載到數據庫中以使它們都是相同的格式,最終目標是將文本加載到數據集中,將其複製到數據庫數據集中,然後將該數據插入到數據庫中。 – Fry 2008-10-06 20:27:36

1

不完全是優雅的,但表現可能會更好:

  • 加載整個文件到表中只有一列「行」,只要文本(類似於你現在要做什麼地方
  • 使用存儲程序裂開等領域,並創建插件
  • 在服務器上執行的插入

當你還在插入每一行seperately,您不會創建相當的很多網絡流量。

詳細說明,原始方法在客戶端生成語句,然後在客戶端執行它們,從而導致每行的網絡流量。我的建議是在服務器上生成語句(在存儲過程中),並讓它們在服務器上執行,從而不會產生新的網絡流量。

「正確的」解決方案是使用數據庫特定的導入工具(如SQL Loader for Oracle)。性能收益是巨大的。 (我們正在大約5分鐘內裝載2000萬行巨大的表格)。但當然,這不是非常通用的。

1

嗯,我設法讓文本文件的行到數據庫數據集中,到目前爲止,這個方法似乎更快。我用

Dataset.Tables[x].ImportRow(DataRow) 

當然現在它只是讓DataAdapter.Update(Dataset)工作。看網上說是會很有趣......

更新

爲DataAdapter.Update命令會通過線插入線做這種方法不會產生更快的結果。

0

BULK INSERT dbo.ImportTest FROM 'C:\ ImportData.txt' WITH(FIELDTERMINATOR = '',FIRSTROW = 2)

相關問題