Я пытаюсь скопировать базу данных в новую базу данных на том же сервере. Сервер - это мой локальный компьютер под управлением SQL 2008 Express под Windows XP.
Это легко сделать с помощью класса 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) "
Я также пытался включить именованные каналы на сервере, но это не помогает.
Edit:
Я нашел решение, которое работает, создав резервную копию, а затем восстановив ее в новой базе данных. Это довольно неуклюже и медленнее, чем должно быть, поэтому я все еще ищу лучшее решение.