c# - 尝试使用 MySqlBulkCopy 插入数据总是以复制 X 行、插入 0 行结束

标签 c# mysql

我有一个 MySQL 数据库,其中有一个名为 "mytable" 的表,我想在其中插入 MyObject 类型的对象 我正在使用 C# 和 .NET Framework 4.7.2(目前我无法将此特定项目升级到更新版本,因为这不是我的决定)

public class MyObject
{
    public int Number {get; set;}
    public int Number2 {get; set; }
    public string Name {get; set;}
    public DateTime Date {get; set;}
    
    public MyObject() {}
}

表格如下所示:

'number' - INT(11)
'number2' - INT(11)
'name' - CHAR(16)
'date' - DATETIME

其中 'number''number2' 构成主键

我正在尝试使用 MySqlConnector.NET 中的 MySqlBulkCopyMyObject 实例列表插入表中

我这样做:

MySqlBulkCopy bulkCopy = new MySqlBulkCopy(myConnection); //I can not share the connection details like the password, but it is a valid one that I successfully write to with other commands
bulkCopy.DestinationTableName = "mytable";

List<MyObject> objects = GetHugeNumberOfObjects();

DataTable dataTable = new DataTable("mytable");
dataTable.Clear();

List<string> primaryKey = new List<string>();
primaryKey.Add("number");
primaryKey.Add("number2");

dataTable.PrimaryKey = primaryKey.ToArray();
dataTable.MinimumCapacity = objects.Count;

dataTable.Columns.Add("number", typeof(int));
dataTable.Columns.Add("number2", typeof(int));
dataTable.Columns.Add("name", typeof(string));
dataTable.Columns.Add("date", typeof(DateTime));

foreach(MyObject current in objects)
{
    DataRow newRow = dataTable.NewRow();
    newRow["number"] = current.Number;
    newRow["number2"] = current.Number2;
    newRow["name"] = current.Name;
    newRow["date"] = current.Date;
    
    dataTable.Rows.Add(newRow);
}

dataTable.AcceptChanges();

bulkCopy.ColumnMappings.Add(new MySqlBulkCopyColumnMapping(0, "number"));
bulkCopy.ColumnMappings.Add(new MySqlBulkCopyColumnMapping(1, "number2"));
bulkCopy.ColumnMappings.Add(new MySqlBulkCopyColumnMapping(2, "name"));
bulkCopy.ColumnMappings.Add(new MySqlBulkCopyColumnMapping(3, "date"));

bulkCopy.WriteToServer(dataTable);

发生的情况是,当调用 WriteToServer 时,我总是收到一条异常消息:

X rows copied but 0 inserted

其中X是匹配objects.Count的正确计数,并且没有其他信息或内部异常。 我尝试过错误地设置行和列映射,并得到了与它们相关的不同异常,因此这确保了我至少它们设置正确。 一件似乎没有什么区别的事情是没有在 dataTable 中设置主键,无论我是否设置它都没有区别,我仍然收到“X 复制但 0 插入”错误。

myConnection 的连接字符串包括“AllowLoadLocalInfile=true”,所以这也不是问题,而且我将此连接用于常规 MySQL 命令,它们一切正常。

我尝试只插入一行并查看调试器以查看没有空值并且一切都应该如此,我不认为它来自无效数据,但即使使用单行 - “复制 1 行,插入 0 行”

我尝试调用MySqlBulkCopy.WriteToServerAsync,但这没有什么区别,事实上我认为另一个方法只是在内部调用异步版本并等待它。

我尝试寻找有关如何在 Internet 上使用它的示例,也尝试查看 MySqlConnector.NET 的源代码,但无济于事,我无法弄清楚问题是什么,并且没有'首先没有很多例子。

最佳答案

缺少异常详细信息是 known issue在 MySqlConnector 中。请尝试this workaround使用 MySqlConnection.InfoMessage event获取更多详细信息:

var myConnection = ...get connection...
myConnection.InfoMessage += (s, e) =>
{
    // use logging infrastructure of your choice
    foreach (var error in e.Errors)
        Console.WriteLine(error.Message);
};

// ...

myConnection.Open();
MySqlBulkCopy bulkCopy = new MySqlBulkCopy(myConnection);

// rest of your code...

关于c# - 尝试使用 MySqlBulkCopy 插入数据总是以复制 X 行、插入 0 行结束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71958383/

相关文章:

c# - 类不会使用 unity 的 JSONUtility 序列化为 JSON

c# - 在其回调方法中停止计时器

c# - WebClient.DownloadFileAsync 异常

mysql - 从单个文件恢复所有 MySQL 数据库

MySQL 错误 "The server quit without updating PID file"

MySQL - Group By, Max, Inner Join - 问题

c# - Azure TableEntity Flatten 方法不适用于 "Byte"数据类型

c# - 解析大型 json

php - 在 PHP 中使用日期时间格式

sql - MySQL 中的 COUNT CASE 和 WHEN 语句