我有一個 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.NETMyObject將實體串列插入表中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);
發生的情況是,在呼叫 時WriteToServer,我總是收到一條例外訊息:
已復制 X 行,但插入了 0 行
其中X是正確的計數匹配objects.Count,并且沒有附加資訊或內部例外。我嘗試錯誤地設定行和列映射并且得到了與它們相關的不同例外,所以這確保我至少它們被正確設定。似乎沒有區別的一件事是沒有在dataTable中設定主鍵,無論我設定與否都沒有區別,我仍然得到“X復制但0插入”錯誤。
的連接字串myConnection包括“ AllowLoadLocalInfile=true ”,所以這也不是問題,另外我正在將此連接用于常規 MySQL 命令,它們都可以正常作業。
我嘗試僅插入一行并查看除錯器以查看沒有空值并且一切正常,我不認為它來自無效資料,但即使只有一行它也會以同樣的方式失敗- “1行復制0插入”
我嘗試呼叫MySqlBulkCopy.WriteToServerAsync,但沒有區別,實際上我認為另一種方法只是在內部呼叫異步版本并等待它。
我曾嘗試在 Internet 上尋找有關如何使用它的示例,并嘗試查看 MySqlConnector.NET 的源代碼,但無濟于事,我無法弄清楚問題是什么,并且沒有太多示例首先。
uj5u.com熱心網友回復:
缺少例外細節是 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...
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/460607.html
上一篇:使用動態引數(陣列)的PDO查詢
下一篇:僅使用一個查詢替換兩個字串/資料
