我使用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/

10-08 21:39