2009-02-19 142 views
7

使用C#(vs2005)我需要将表从一个数据库复制到另一个。这两个数据库引擎都是SQL Server 2005.对于远程数据库来说,我只有对存储过程的执行访问权限才能获取本地需要的数据。从一个数据库表复制到另一个C#

本地数据库我有更多的控制,因为它需要本地远程表的本地副本[asp.net]应用程序使用。我们希望它本地更容易查找和加入其他表等,

请你给我解释一个有效的方法,将这些数据复制到我们的本地数据库。

本地表可以使用与远程表相同的模式创建,如果它使事情变得更简单。远程表有9列,其中没有一列是标识列。远程表中大约有5400行,这个数字每年增长大约200。所以不是一个快速变化的表格。

+0

(我添加了缺少的DestinationTableName ...) – 2009-02-19 21:35:00

回答

2

我会先看看使用SQL Server集成服务(SSIS,née数据传输服务(DTS))。

它被设计用于在数据库之间移动/比较/处理/转换数据,并且IIRC允许源的任意表达。你会需要它安装在你的数据库上(不应该是一个问题,它是默认安装的一部分)。

否则,在给定数据大小(小)的情况下,将代码解决方案从删除系统中抽取所有数据到内部结构中,然后查找本地不存在的要插入的行。

+0

是一个非常可行的选项,也是我过去经常使用的选项。对于这个特定的项目,我不希望SSIS作业的外部依赖。我很好奇如何在代码中保留所有代码。谢谢你的回应 – Brettski 2009-02-19 17:12:44

11

也许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); 
    } 
} 
+0

啊,很有意思,我喜欢。我在哪里定义目标命令/数据将与定义的连接一起进行?或者我应该阅读SQLBulkCopy的答案? – Brettski 2009-02-19 17:17:37

+0

糟糕 - 是的,我忘记了表名; -p会修复... – 2009-02-19 21:32:45

1

你可能,如果你能不能做到这一点,但” t,不要用程序来做。如果您有任何与控制源服务器的人交谈的方式,请查看他们是否会设置某种数据导出。如果数据与您所说的一样小,那么xml或csv输出将比在c#(或任何语言)中编写东西好100倍。

因此,让我们假设他们无法导出,仍然避免编写程序。你说你对目的地有更多的控制权。你可以设置一个SSIS包,或设置一个链接服务器?如果是这样,你将有一个更容易的时间迁移数据。

如果设置在最低限度源链接服务器,你可以写一个小的T-SQL批处理

TRUNCATE DestTable

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

不如SSIS那么好(你可以更直观地看到发生了什么,但是上面的t-sql非常清晰)。

因为我不会把编程路线,我可以给你会是这样,如果你绝对必须的最佳解决方案:

使用的SqlClient命名空间。

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

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

这将是丑陋的,但它会工作。

0

似乎并不是你需要同步的大量数据。在你描述的条件下(只有SP访问远程数据库并且没有其他办法),你可以选择Marc Gravell的解决方案。 如果数据只能增长并且现有数据无法更改,您可以比较远程和内部DB的记录数以优化操作;如果远程数据库中没有更改,则不需要复制。

相关问题