批量复制或将数据从一个数据库更新到另一个数据库

问题描述 投票:0回答:2

我想通过使用以下标准将数据从一个数据库批量复制或更新到另一个数据库:

  • 根据条形码列复制数据行(如果尚不存在)
  • 如果条形码列数据已存在,则更新目标数据库中的当前数据行

这是我的代码,我从本地数据库获取数据并将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);
        }
    }
}
c# .net bulkinsert sqlbulkcopy bulkupdate
2个回答
0
投票

正如@Jeroen在评论中所写,SqlBulkCopy只能插入。

但是,您可以在临时表中插入并创建SQL以在目标表中执行MERGE语句。

免责声明:我是Bulk Operations项目的所有者

此库不是免费的,但提供您正在寻找的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);
}

-1
投票

您正在使用特定的连接类到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
© www.soinside.com 2019 - 2024. All rights reserved.