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

时间:2009-02-19 15:09:30

标签: c# sql-server ado.net

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

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

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

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

5 个答案:

答案 0 :(得分:11)

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

答案 1 :(得分:10)

ADO.NET的批量复制功能可能有助于您查看:

MSDN - Multiple Bulk Copy Operations (ADO.NET)

An example article

答案 2 :(得分:2)

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

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

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

答案 3 :(得分: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个SqlConnections,2个SqlCommands,并获取1个SqlReader的实例。

遍历源阅读器,并使用。

为每次迭代执行目标SqlCommand插入。

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

答案 4 :(得分:0)

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