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

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

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

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

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

ADO.NET的批量复制function可能会帮助您了解:

MSDN – 多个批量复制操作(ADO.NET)

一篇示例文章

也许是SqlBulkCopy; 使用SqlCommand.ExecuteReader获取在调用SqlBulkCopy.WriteToServer时使用的阅读器。 这与bulk-insert相同,所以非常快。 它应该看起来像(未经测试);

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); } } 

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

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

否则,给定数据大小(小)的代码解决方案将所有数据从remove系统拉入内部结构,然后查找本地不存在的行以插入。

您可能无法做到这一点,但如果您不能这样做,请不要使用程序。 如果您有任何方式与控制源服务器的人交谈,请查看他们是否会设置某种类型的数据导出。 如果数据和你说的一样小,那么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插入。

它会很难看,但它会起作用。

似乎不是必须同步的大量数据。 在您描述的条件下(只有SP访问远程数据库而无法获得其他任何东西),您可以使用Marc Gravell的解决方案。 如果数据只能增长并且现有数据无法更改,您可以比较远程和内部数据库上的记录数,以优化操作; 如果远程数据库中没有变化则无需复制。