Если бы я делал это в .NET с помощью dapper, я бы использовал c # и сделал бы следующее:
предположения:
таблица в обеих таблицах с одной и той же схемой;
CREATE Events (
EventId int,
EventName varchar(10));
A .Net class
public class Event
{
public int EventId { get; set; }
public string EventName { get; set; }
}
Ниже приведен фрагмент кода, который вы можете использовать в качестве основы.
List<Event> Events = new List<Event>();
var sqlInsert = "Insert into events( EventId, EventName ) values (@EventId, @EventName)";
using (IDbConnection sqlconn = new SqlConnection(Sqlconstr))
{
sqlconn.Open();
Events = sqlconn.Query<Event>("Select * from events").ToList();
using (IDbConnection mySqlconn = new SqlConnection(Sqlconstr))
{
mySqlconn.Open();
mySqlconn.Execute(sqlInsert, Events);
}
}
Приведенный выше фрагмент выбирает строки изтаблица событий в SQL Server и заполняет список событий.обычно Dapper возвращает IEnumerable <>, но вы используете этот ToList ().Теперь со списком событий вы подключаетесь к MySQL и выполняете операторы вставки для списка событий.Этот фрагмент всего лишь пример скелета.Без транзакции на Execute каждая строка будет автоматически подтверждена.Если вы добавите транзакцию, она будет зафиксирована, когда все элементы в списке событий будут вставлены.
Конечно, у этого способа есть недостатки.Важно понимать, что если вы пытаетесь вставить 1 миллион строк из SQL в MySQL, этот список будет содержать 1 миллион записей, что увеличит объем используемой памяти.В этих случаях я бы использовал опцию Dapper's Buffered = false.Это вернет 1 миллион строк по 1 строке за раз.Ваш код C # может перечислять результаты и добавлять строку в список и вести счетчик.после того, как 1000 строк были вставлены в список, вы можете выполнить вставку в MySQL, затем очистить список и продолжить перечисление по строкам.
это уменьшит объем памяти вашего приложения при обработке большого количества строк.
С учетом всего сказанного ничто не сравнится с массовой вставкой на уровне сервера.
-HTH