.NET вставка данных из SQL Server в MySQL без зацикливания данных - PullRequest
0 голосов
/ 02 апреля 2019

Я работаю в приложении .NET, где пользователь выбирает некоторые фильтры, такие как дата, идентификатор и т. Д.

Что мне нужно сделать, это запросить таблицу базы данных SQL Server с этими фильтрами и выгрузить их втаблица MySQL.Мне не нужны все поля в таблице, только несколько.

Пока мне нужно пройтись по всем записям в наборе данных SQL Server и вставить их одну за другой в мою таблицу MySQL.

Есть ли способ достичь лучшей производительности?Я играл с Dapper, но не могу найти способ сделать что-то вроде:

Insert into MySQLTable (a,b,c)
Select a,b,c from SQLServerTable
where a=X and b=C

Любые идеи?

Опция связанного сервера невозможна, потому что у нас нет доступа к SQLконфигурации сервера, поэтому ищите наиболее эффективный способ массовой вставки данных.

1 Ответ

0 голосов
/ 03 апреля 2019

Если бы я делал это в .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

...