带有列映射的MySqlBulkLoader?

时间:2015-02-24 09:00:41

标签: 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的地方写了一个库,但是我遇到了其他使用它的问题而且它并非来自官方来源。

2 个答案:

答案 0 :(得分:1)

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

首先,更改此代码块

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();
}

答案 1 :(得分:1)

以David Hartley的答案为基础:如果您不知道列名是先验的,您可以清除列列表并重新添加项目。

这将是这样的:

bl.Columns.Clear(); foreach (string col in yourColumns) { bl.Columns.Add(col); }