c# - 具有列映射的 MySqlBulkLoader?

标签 c# mysql bulkinsert sqlbulkcopy

我使用 SqlBulkCopy 对 SQL Server 数据库进行批量插入。我现在为我的程序提供MySql支持,最接近SqlBulkCopy的是MySqlBulkLoader。但在 MySqlBulkLoader 中,我必须首先将 DataTable 转换为文件,因为 MySqlBulkLoader 仅适用于文件,不适用于 DataTable >。然后我必须在插入之前禁用外键检查。我已经完成了这两件事,但现在我还剩下一个问题:

我的目标表有一个标识列(自动增量和 PK),并且 MySqlBulkLoader 将源文件中的第一列映射到此列,因此只有第一条记录会插入错误的列映射。以下是我如何使用该功能(如果有帮助的话):

using (var conn = new MySqlConnection(connectionString))
{
    var bl = new MySqlBulkLoader(conn);
    bl.TableName = tableName;
    bl.Timeout = 600;
    bl.FieldTerminator = ",";
    bl.LineTerminator = "\r\n";
    bl.FileName = tempFilePath;
    bl.NumberOfLinesToSkip = 1;
    numberOfInsertedRows = bl.Load();
}

这是我文件中的前几行:

CampaignRunId,RecipientId,IsControlGroup
27,"testrecipient_0",False
27,"testrecipient_1",False
27,"testrecipient_2",False
27,"testrecipient_3",False
27,"testrecipient_4",False
27,"testrecipient_5",False
27,"testrecipient_6",False
27,"testrecipient_7",False
27,"testrecipient_8",False
27,"testrecipient_9",False
27,"testrecipient_10",False
27,"testrecipient_11",False
27,"testrecipient_12",False
27,"testrecipient_13",False

有没有办法为MySqlBulkLoader提供列映射?我看到它有一个 Columns 属性,但它是只读的。

有一个名为 MySqlBulkCopy 的库。但我在使用它时遇到了其他问题,而且它不是来自官方来源。

最佳答案

我最近也在使用 MySqlBulkLoader,并且发现需要使用 Columns 属性,以便将从 MSSQL 中提取的日期格式化为正确的格式以插入到 MySQL 中。 columns 属性是只读的,但这仅意味着您需要在创建对象时设置属性,而不是之后设置。

首先,更改此代码块

using (var conn = new MySqlConnection(connectionString))
{
    var bl = new MySqlBulkLoader(conn);
    bl.TableName = tableName;
    bl.Timeout = 600;
    bl.FieldTerminator = ",";
    bl.LineTerminator = "\r\n";
    bl.FileName = tempFilePath;
    bl.NumberOfLinesToSkip = 1;
    numberOfInsertedRows = bl.Load();
}

对此:

using (var conn = new MySqlConnection(connectionString))
{
    var bl = new MySqlBulkLoader(conn)
    {
        TableName = tableName,
        Timeout = 600,
        FieldTerminator = ",",
        LineTerminator = "\r\n",
        FileName = tempFilePath,
        NumberOfLinesToSkip = 1
    };
    var numberOfInsertedRows = bl.Load();
}

然后,您可以继续使用 Columns 属性所需的任何值,因此最终的代码块可能如下所示:

using (var conn = new MySqlConnection(connectionString))
{
    var bl = new MySqlBulkLoader(conn)
    {
        TableName = tableName,
        Timeout = 600,
        FieldTerminator = ",",
        LineTerminator = "\r\n",
        FileName = tempFilePath,
        NumberOfLinesToSkip = 1,
        Columns = { "CampaignRunId", "RecipientId", "IsControlGroup" }
    };
    var numberOfInsertedRows = bl.Load();
}

关于c# - 具有列映射的 MySqlBulkLoader?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28691620/

相关文章:

mysql - 复制 wordpress 分类表查询时遇到问题

MySQL 在值更改时插入新行

sql-server - 批量插入 fmt 文本限定符

c# - 影片下载

Javascript 与 C# 在 ASP.NET 4.5 MVC 中动态更改元素类/id

mysql - Devart MySQL 6.10.96 或 MySQL 连接器 6.3.6?

elasticsearch - 通过 9300 和 9200 端口的 ElasticSearch API 有什么区别?

c# - 统一点击检测游戏对象

C# 如何检测文件是否在另一个进程中打开

mysql - 我可以在一个请求中插入最佳记录数或数据大小吗?