我有一个 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() {}
}
Run Code Online (Sandbox Code Playgroud)
该表如下所示:
'number' - INT(11)
'number2' - INT(11)
'name' - CHAR(16)
'date' - DATETIME
Run Code Online (Sandbox Code Playgroud)
其中'number'和'number2'构成主键
我正在尝试使用MySqlConnector.NET将实例列表插入MyObject表中MySqlBulkCopy
我这样做:
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);
Run Code Online (Sandbox Code Playgroud)
发生的情况是,当调用 时WriteToServer,我总是收到一条异常消息:
复制 X 行但插入 0 行
其中X是正确的计数匹配objects.Count,并且没有附加信息或内部异常。我尝试过错误地设置行和列映射,并得到了与它们相关的不同异常,因此这确保了我至少它们设置正确。一件似乎没有什么区别的事情是没有在 dataTable 中设置主键,无论我是否设置它都没有区别,我仍然收到“X 复制但 0 插入”错误。
连接字符串myConnection包括“ AllowLoadLocalInfile=true ”,所以这也不是问题,而且我将此连接用于常规 MySQL 命令,它们都工作正常。
我尝试只插入一行并查看调试器以查看没有空值并且一切都应该如此,我不认为它来自无效数据,但即使是单行它也会以同样的方式失败- “复制 1 行,插入 0 行”
我尝试调用MySqlBulkCopy.WriteToServerAsync,但没有什么区别,事实上我认为另一种方法只是在内部调用异步版本并等待它。
我尝试过寻找有关如何在互联网上使用它的示例,也尝试过查看 MySqlConnector.NET 的源代码,但无济于事,我无法弄清楚问题是什么,并且示例不多首先。
缺乏异常详细信息是 MySqlConnector 中的一个已知问题。请尝试使用该事件的解决方法来获取更多详细信息:MySqlConnection.InfoMessage
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...
Run Code Online (Sandbox Code Playgroud)