【问题标题】:Issue with MySqlBulkLoader from C# appC# 应用程序中的 MySqlBulkLoader 问题
【发布时间】:2026-02-13 11:15:01
【问题描述】:

我正在编写一个应用程序,每晚将一些数据从 MSSQL 导出到 MySQL 服务器。我使用一个简单的查询来获取前一天的所有数据,然后尝试了几种不同的方法将其传输到 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();

有什么想法吗?

【问题讨论】:

    标签: c# mysql


    【解决方案1】:

    看起来有点奇怪,但一时兴起,我决定在我的输出文件顶部写一个空行,然后设置 NumberOfLinesToSkip = 1。这样做之后,一切正常,没有任何记录丢失。有点奇怪。似乎将其设置为 0 不起作用,可能不受支持。

    【讨论】:

    • 我也有同样的经历。
    【解决方案2】:

    我遇到了类似的问题,它加载了我文件中大约 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

    【讨论】: