2009-02-19 137 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的記錄數以優化操作;如果遠程數據庫中沒有更改,則不需要複製。

相關問題