从一个数据库表复制到另一个数据库表 C#

12

使用C#(vs2005)需要将一张表从一个数据库复制到另一个数据库。两个数据库引擎都是SQL Server 2005。对于远程数据库(源数据库),我只有执行一个存储过程的权限,以获取我需要本地传输的数据。

本地数据库我有更多的控制权,因为它被[asp.net]应用程序使用,需要一个本地副本这个远程表格。我们希望本地副本更容易进行查找和与其他表进行联接等操作。

请您向我解释一种有效的方法将这些数据复制到我们的本地数据库中。

如果可以简化操作,本地表格可以使用相同的模式创建为远程表格。远程表格有9列,没有身份标识列。远程表格中有大约5400行,并且每年会增加约200行。所以它不是一个快速变化的表格。


(我添加了缺失的DestinationTableName...) - Marc Gravell
5个回答

18

您可以使用 SqlBulkCopy;使用 SqlCommand.ExecuteReader 获取读取器,然后在调用 SqlBulkCopy.WriteToServer 时使用该读取器。这与批量插入相同,因此非常快速。代码应该类似于(未经测试):

using (SqlConnection connSource = new SqlConnection(csSource))
using (SqlCommand cmd = connSource.CreateCommand())
using (SqlBulkCopy bcp = new SqlBulkCopy(csDest))
{
    bcp.DestinationTableName = "SomeTable";
    cmd.CommandText = "myproc";
    cmd.CommandType = CommandType.StoredProcedure;
    connSource.Open();
    using(SqlDataReader reader = cmd.ExecuteReader())
    {
        bcp.WriteToServer(reader);
    }
}

1
啊,非常有趣,我喜欢它。我在哪里定义目标命令/数据在已定义的连接中的位置?还是我应该阅读SQLBulkCopy以获取答案? - Brettski

12

我不确定在没有源数据库的选择访问权限的情况下是否能够正常工作,但是由于其与其他方法相比的速度之快,这绝对值得研究! - Astra

2
我首先会考虑使用SQL Server Integration Services(SSIS,曾用名Data Transfer Services(DTS))。
它专为在数据库之间移动/比较/处理/转换数据而设计,而且我记得它允许源使用任意表达式。您需要将其安装在数据库上(这不应该成为问题,它是默认安装的一部分)。
否则,鉴于数据大小(小),可以使用代码解决方案,从远程系统中提取所有数据到内部结构,然后查找本地不存在的行以进行插入。

是的,这是一个非常可行的选择,我过去经常使用它。对于这个特定的项目,我不想要一个SSIS作业的外部依赖。我很好奇如何在这个项目中保持所有代码的完整性。谢谢您的回复。 - Brettski

1
你可能做不到这个,但如果你做不到的话,不要通过程序去做。如果你能与控制源服务器的人交谈,看看他们是否可以设置一些数据导出方式。如果数据如你所说的那么小,那么XML或CSV输出比编写C#(或任何语言)要好100倍。

所以让我们假设他们不能导出,即使如此,也要避免编写程序。你说你对目标有更多的控制权。你能够设置一个SSIS包或者建立一个链接服务器吗?如果是这样,你将更容易地迁移数据。

如果你至少将源设置为链接服务器,你可以编写一个小的T-SQL批处理:

TRUNCATE DestTable

INSERT INTO DestTable SELECT SourceTable.Star FROM [SourceServer].[Schema].[Table]

虽然没用SSIS那么漂亮(你会看到更多的可视化内容,但上面的T-SQL非常清晰)。

既然我不会选择编程路线,我能给你最好的解决方案就是,如果你绝对必须要:

使用SqlClient命名空间。

因此,创建2个SqlConnection、2个SqlCommands,并获取1个SqlReader的实例。

遍历源读取器,并在每次迭代中执行目标SqlCommand插入。

这可能不太美观,但它会起作用。


SSIS对我们来说不起作用。我们想要复制除了一些(大)表之外的所有内容。使用SSIS无法实现这一点。或者至少在数百个表结构发生更改时会崩溃。 - Jens Mander

0

看起来您需要同步的数据量并不大。根据您所描述的条件(仅使用 SP 访问远程数据库,且无法获得任何其他内容),您可以选择 Marc Gravell 的解决方案。 如果数据只能增长而现有数据不能更改,则可以比较远程和内部数据库中的记录计数,以优化操作;如果远程数据库没有更改,则无需复制。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接