2012-04-11 43 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