【发布时间】:2010-09-21 01:39:11
【问题描述】:
我正在尝试将数据库复制到同一服务器上的新数据库中。服务器是我在 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 的连接)"
我也尝试在服务器上启用命名管道,但这无济于事。
编辑: 我找到了一个解决方案,通过备份然后将其恢复到新数据库来工作。虽然它很笨拙,而且比它应该的要慢,所以我仍在寻找更好的解决方案。
【问题讨论】:
标签: c# .net sql-server-2008 smo