3

我正在编写一个应用程序,每晚将一些数据从 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();

有任何想法吗?

4

2 回答 2

3

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

于 2012-04-12T14:49:20.330 回答
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

于 2016-09-13T17:31:30.953 回答