【问题标题】:SqlBulkCopy Wcf Rest Moving Data between 2 sql server tablesSqlBulkCopy Wcf Rest 在 2 个 sql server 表之间移动数据
【发布时间】:2015-07-27 03:24:54
【问题描述】:

我正在尝试将某些表中的数据从一个 sql server 数据库移动到另一个 sql server 数据库。我打算写一个 wcf 休息服务来做到这一点。我也在尝试使用 SQLBulkCopy 来实现这一点。我正在尝试在单击按钮时实现以下功能。将 Table1 数据从源 sql server 复制到目标 sql server 中的表 1。与表 2 和表 3 相同。我在几件事上受阻。 sql bulk copy 是 wcf rest 服务传输数据的最佳选择吗?我被要求不要在这个任务中使用 ssis。如果在将数据从源移动到目标时出现任何异常,则应将目标数据还原回来。这有点像交易。如何实现此交易功能。任何指针都会有所帮助。

【问题讨论】:

  • 我的其余服务,因为这甚至没有使用服务来复制数据
  • 好吧,您可以将代码包装在 TransactionScope 中。这可能会有所帮助。还有,为什么要使用 REST 服务?

标签: c# wcf rest sqlbulkcopy


【解决方案1】:

根据您提供的信息,您的解决方案类似于我插入的示例代码。 SQLBulkCopy 的指针:BCopyTutorial1BCopyTutorial2 带有事务范围示例的 SQLBulkCopy:TrasactionBulkCopy

根据您的问题,我的版本是这些的简化版本。

界面:

[ServiceContract]
public interface IYourBulkCopyService {

    [OperationContract]
    void PerformBulkCopy();
}

实施:

public class YourBulkCopyService : IYourBulkCopyService {

    public void PerformBulkCopy() {
        string sourceCs =  ConfigurationManager.AppSettings["SourceCs"];
        string destinationCs =  ConfigurationManager.AppSettings["DestinationCs"];

        // Open a sourceConnection to the AdventureWorks database. 
        using (SqlConnection sourceConnection = new SqlConnection(sourceCs) {
            sourceConnection.Open();

            //  Get data from the source table as a SqlDataReader.         
            SqlCommand commandSourceData = new SqlCommand(
                "SELECT * FROM YourSourceTable", sourceConnection);
            SqlDataReader reader = commandSourceData.ExecuteReader();

            //Set up the bulk copy object inside the transaction.  
            using (SqlConnection destinationConnection = new SqlConnection(destinationCs)) {
                destinationConnection.Open();

                using (SqlTransaction transaction = destinationConnection.BeginTransaction()) {
                    using (SqlBulkCopy bulkCopy = new SqlBulkCopy(
                               destinationConnection, SqlBulkCopyOptions.KeepIdentity,
                               transaction)) {
                        bulkCopy.BatchSize = 10;
                        bulkCopy.DestinationTableName =
                            "YourDestinationTable";

                        // Write from the source to the destination. 
                        try {
                            bulkCopy.WriteToServer(reader);
                            transaction.Commit();
                        } catch (Exception ex) {
                            // If any error, rollback
                            Console.WriteLine(ex.Message);
                            transaction.Rollback();
                        } finally {
                            reader.Close();
                        }
                    }
                }
            }
        }
    }
}

【讨论】:

  • 我认为提问者不想公开直接连接到两个数据库的端点。
  • 暴露在哪里?它完全取决于系统的架构。它可能是由多个应用程序服务器组成的业务层,必须在它们之间共享此操作。这意味着它不会暴露给表示层。我同意它不应该是最终用户可以直接调用此操作的用户界面。 OP 要求启动此操作的 WCF 服务,我将其设置在一个简化的框架中(正如我在回答中所述),这为它提供了空间。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-05
  • 1970-01-01
  • 2012-05-31
  • 2018-01-11
  • 1970-01-01
相关资源
最近更新 更多