我想將數據庫的副本複製到同一臺服務器上的新數據庫。服務器是在Windows XP下運行SQL 2008 Express的本地計算機。 使用SMO.Transfer類應該很容易,它幾乎可以工作!使用SMO複製數據庫和數據
我的代碼如下(有些簡化):
Server server = new Server("server");
Database sourceDatabase = server.Databases["source database"];
Database newDatbase = new Database(server, "new name");
newDatbase.Create();
Transfer transfer = new Transfer(sourceDatabase);
transfer.CopyAllObjects = true;
transfer.Options.WithDependencies = true;
transfer.DestinationDatabase = newDatbase.Name;
transfer.CopySchema = true;
transfer.CopyData = true;
StringCollection transferScript = transfer.ScriptTransfer();
using (SqlConnection conn = new SqlConnection(connectionString))
{
conn.Open();
using (SqlCommand switchDatabase = new SqlCommand("USE " + newDatbase.Name, conn))
{
switchDatabase.ExecuteNonQuery();
}
foreach (string scriptLine in transferScript)
{
using (SqlCommand scriptCmd = new SqlCommand(scriptLine, conn, transaction))
{
int res = scriptCmd.ExecuteNonQuery();
}
}
}
我在這裏做的是先創建一個新的數據庫,然後使用Transfer
類生成一份腳本,最後運行該腳本在新數據庫。
這適用於複製結構,但CopyData
選項不起作用!
CopyData
選項是否有任何未公開的限制?該文檔只說明該選項指定是否複製數據。
我使用TransferData()
方法複製DATABSE不使用腳本,但然後我得到,說:「無法連接到服務器」與內部異常,說「發生網絡相關的或特定的情況下,錯誤的異常嘗試同時建立到SQL Server的連接服務器未找到或無法訪問驗證實例名稱是否正確以及SQL Server是否配置爲允許遠程連接(提供程序:命名管道提供程序,錯誤:40 - 無法打開一個連接到SQL Server)「
我也嘗試在服務器上啓用命名管道,但這沒有幫助。
編輯: 我找到了一個解決方案,通過製作備份,然後將其恢復到新的數據庫。儘管這很笨拙,但比預想的要慢,所以我仍然在尋找更好的解決方案。
備份和恢復總是會更快,因爲它不受鎖定開銷,事務處理等的影響。備份的設計對於這類事情來說是非常快速的。對不起,我沒有早點找到你! :-D – 2008-12-01 13:13:03
但是,運行備份可能會干擾當前的備份順序和日誌傳輸/截斷。您是否可以使用SMO創建COPY_ONLY備份,如http://msdn.microsoft.com/en-us/library/ms191495.aspx「 – flipdoubt 2010-12-08 15:37:41