我有一个看起来像这样的存储过程:
InsertItem: INSERT INTO (IN itemId INT, name TEXT);
有没有办法可以执行大部分内容? 喜欢而不是执行类似的东西:
using (MySqlConnection connection = new MySqlConnection(_connectionString))
{
connection.Open();
foreach (Item item in GetItems())
{
using (MySqlCommand command = new MySqlCommand("InsertItem", connection))
{
command.CommandType = CommandType.StoredProcedure;
command.Parameters.AddWithValue("@itemId", item.ItemId);
command.Parameters.AddWithValue("@name", item.Name);
command.ExecuteNonQuery();
}
}
}
我试图在没有成功的情况下实现代码:
using (MySqlConnection connection = new MySqlConnection(_connectionString))
{
connection.Open();
using (MySqlCommandBulk command = new MySqlCommand("InsertItem", connection))
{
command.CommandType = CommandType.StoredProcedure;
for (Item item in GetItems())
{
MySqlCommandBulkItem bulkItem = new MySqlCommandBulkItem();
bulkItem["itemId"] = item.ItemId;
bulkItem["name"] = item.Name;
command.BulkItems.Add(bulkItem);
}
command.Execute();
}
}
我的观点是该命令会立即发送所有数据,并且不会单独发送每个查询 有什么想法吗?
答案 0 :(得分:0)
Dotnet框架的Oracle连接器允许使用数组代替参数上的标量。但MySQL连接器没有。
有两种方法可以加速MySQL中的批量加载。
其中一个适用于InnoDB表,但对MyISAM表没有帮助。开始交易。然后,在每几百行之后,执行COMMIT并启动另一行。这会将表插入提交成串,这比单独自动提交它们要快。
另一种方法是使用MySQL的LOAD DATA INFILE命令来填充数据文件并将其批量插入数据库。这非常快,但您必须努力正确地格式化文件。