我正在尝试将数据库复制到同一服务器上的新数据库中。服务器是我在 Windows XP 下运行 SQL 2008 Express 的本地计算机。使用 SMO.Transfer 类应该很容易做到这一点,而且它几乎可以工作!
我的代码如下(有些简化):
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()
方法在不使用脚本的情况下复制数据库,但随后出现“无法连接到服务器”的异常,内部异常显示“在建立与SQL Server。未找到或无法访问服务器。验证实例名称是否正确以及 SQL Server 是否配置为允许远程连接。(提供程序:命名管道提供程序,错误:40 - 无法打开与 SQL Server 的连接)"
我还尝试在服务器上启用命名管道,但这没有帮助。
编辑:我找到了一个解决方案,可以通过备份然后将其恢复到新数据库来工作。虽然它很笨拙,而且比它应该的要慢,所以我仍在寻找更好的解决方案。