Массовое копирование или обновление данных из одной базы данных в другую - PullRequest
0 голосов
/ 04 сентября 2018

Я хотел бы массово копировать или обновлять данные из одной базы данных в другую, используя следующие критерии:

  • Копировать строку данных, если она еще не существует, на основе столбца штрих-кода
  • Обновить текущую строку данных в целевой базе данных, если данные столбца штрих-кода уже существуют

Это мой код, где я получаю данные из локальной базы данных и BulkCopy их в центральную базу данных. Как мне добавить эти условия в мой код?

string localConnectionString = GetLocalConnection();
string sqlConnectionStringNP01 = GetNP01Connection();

using (DataTable dt = new DataTable())
{
    using (SqlConnection conn = new SqlConnection(localConnectionString))
    using (SqlCommand cmd = new SqlCommand(sql, conn))
    using (SqlDataAdapter adapter = new SqlDataAdapter(cmd))
    {
        // Getting Local DB Data
        cmd.CommandType = commandType;
        cmd.Connection.Open();

        adapter.SelectCommand.CommandTimeout = 240;
        adapter.Fill(dt);
        adapter.Dispose();
    }

    // Copying to Central Database
    using (SqlConnection conn2 = new SqlConnection(sqlConnectionStringNP01))
    {
        conn2.Open();

        using (SqlBulkCopy copy = new SqlBulkCopy(conn2))
        {
            // I want to add the code to do the checking here if possible
            copy.DestinationTableName = destinationTable;
            copy.BatchSize = 1000;
            copy.BulkCopyTimeout = 240;
            copy.WriteToServer(dt);
            copy.NotifyAfter = 1000;

            MessageBox.Show("Data successfully transfered to Central Database", "Success!", MessageBoxButtons.OK, MessageBoxIcon.Information);
        }
    }
}

Ответы [ 2 ]

0 голосов
/ 06 сентября 2018

Как писал @Jeroen в своем комментарии, SqlBulkCopy может только вставить.

Однако вы можете вставить во временную таблицу и создать SQL для выполнения вашего оператора MERGE в вашей целевой таблице.

Отказ от ответственности : я владелец проекта Массовые операции

Эта библиотека не является бесплатной, но предлагает вариант BulkMerge, который вы ищете.

using (BulkOperation copy = new BulkOperation(conn2))
{
    copy.DestinationTableName = destinationTable;
    copy.BatchSize = 1000;
    copy.BatchTimeout = 240;
    copy.BulkMerge(dt);

    MessageBox.Show("Data successfully transfered to Central Database", "Success!", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
0 голосов
/ 05 сентября 2018

Вы используете определенный класс соединения с Sql Server, поэтому ваш код не должен работать с другими RDBMS. Я предлагаю вам использовать хранимую процедуру, чтобы добавить все ваши условия, заключенные в транзакцию:

DECLARE
        @CrLf nvarchar(2),
        @Exception nvarchar(4000)

SET @CrLf=char(13) + char(10)

BEGIN TRY
    BEGIN TRAN YOUR_TRAN

    --YOUR CODE

    COMMIT TRAN YOUR_TRAN
END TRY    
BEGIN CATCH
        ROLLBACK TRAN YOUR_TRAN

        SELECT
            @Exception='Error number: ' + CAST(COALESCE(ERROR_NUMBER(), 0) as nvarchar) + @CrLf + 
            'Procedure name: ' + COALESCE(ERROR_PROCEDURE(), 'N\A') + @CrLf + 
            'Error row: ' + CAST(COALESCE(ERROR_LINE(), 0) as nvarchar) + @CrLf +
            'Error message: ' + COALESCE(ERROR_MESSAGE(), 'N\A')

        PRINT(@Exception)
        RAISERROR (@Exception, -- Message text.
                    16, -- Severity.
                    1 -- State.
                    );
END CATCH
...