来自C#app的MySqlBulkLoader问题

时间:2012-04-11 17:42:42

标签: c# mysql

我正在编写一个应用程序,每晚将一些数据从MSSQL导出到MySQL服务器。我使用一个简单的查询来获取前一天的所有数据,然后尝试了几种不同的方法来获取它。最快的方法是使用MySqlBulkLoader但由于某种原因它没有移动所有数据。在我执行插入操作之后,我将生成的文本文件中的记录与MySQL中的记录数进行比较,并且在某些情况下计数从1开始一直到10。

如果我采用相同的方法将数据传入文本文件但循环遍历文本文件的每一行而不是批量上传并插入语句,则会导入所有记录。

以下是我目前使用的批量上传代码。我最近添加了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 个答案:

答案 0 :(得分:2)

似乎有点奇怪,但我突然想到在顶部用空行编写输出文件,然后设置NumberOfLinesToSkip = 1.执行此操作后,一切正常,没有记录丢失。有点奇怪。似乎将其设置为0不起作用,可能不受支持。

答案 1 :(得分: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而不是Ignore(默认值)来覆盖此行为。请注意,这也会影响它处理重复键的方式。

有关mysql的加载数据的更多信息:http://dev.mysql.com/doc/refman/5.7/en/load-data.html