2012-04-11 92 views
2

MySqlBulkLoader我寫一個應用程序將一些數據從MSSQL導出到MySQL服務器每晚的基礎上。我使用一個簡單的查詢來獲取前一天的所有數據,然後嘗試了幾種不同的方法來獲取它到MySQL。最快的方法是使用MySqlBulkLoader,但由於某些原因,它並未移動所有數據。在插入之後,我將生成的文本文件中的記錄與MySQL中的記錄數進行比較,並且計數在某些情況下從1到10一直偏離到10.問題從C#應用程序

如果我採用與獲取數據到文本文件相同的方法,但循環遍歷文本文件的每一行而不是批量上傳並執行插入語句,所有記錄都會被導入。

這是我目前使用的批量上傳代碼。我最近添加了FieldQuotationCharacter以查看是否有幫助,而不是(當我添加時,我使文本生成腳本將引號括起來)。

uploader.TableName = "testtable"; 
uploader.FieldTerminator = "\t"; 
uploader.LineTerminator = "\r\n"; 
uploader.NumberOfLinesToSkip = 0; 
uploader.FileName = updateFile; //this is a variable pointing to the current file 
uploader.Timeout = 120; 
uploader.FieldQuotationCharacter = '"'; 
int totalExported = uploader.Load(); 

任何想法?

回答

2

似乎有點奇怪,但突發奇想,我決定在頂部寫一個空行的輸出文件,然後設置NumberOfLinesToSkip = 1。完成此操作後,一切正常,沒有記錄丟失。有點奇怪。似乎將其設置爲0不起作用,可能不受支持。

+0

我有同樣的經驗。 – 2016-04-22 11:45:03

0

我有一個類似的問題,它在我的文件中加載了大約2/3的行,問題原來是由MySqlBulkLoader生成的加載數據sql中的local關鍵字的行爲。

默認情況下,它似乎MySqlBulkLoader.Local == TRUE,這允許它使用本地文件,而且還影響了錯誤處理無效行。當一行無效時,不會拋出錯誤,它會給你「警告」。您可以驗證這一點,並通過負載數據運行的實際SQL命令查看警告(這是什麼MySqlBulkLoader用途):

load data local infile '/Temp/bb7dd81c-c79f-49c7-9ae4-fdc8e48df6d5.csv' 
ignore into table my_staging_tbl 
fields terminated by ',' enclosed by '"' escaped by '\\' 
lines terminated by '\n' 

此輸出受影響的行數和所有的警告名單

在我的情況,我有LineTerminator爲「\ n」,而不是「\ r \ n」,將警告被抑制後,最終仍導入最行。

您可以通過將MySqlBulkLoader.ConflictOption設置爲MySqlBulkLoaderConflictOption.Replace而不是忽略默認值來覆蓋此行爲。請注意,這也影響它處理重複鍵的方式。

更多關於mysql的加載數據內容:http://dev.mysql.com/doc/refman/5.7/en/load-data.html