我想将数据库的副本复制到同一台服务器上的新数据库。服务器是在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