Я пытаюсь сделать копию базы данных для новой базы данных на том же сервере. Сервер - это мой локальный компьютер с 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();
}
}
}
Что я здесь делаю, это сначала создать новую базу данных, затем сгенерировать копию script с помощью класса Transfer
и, наконец, запустить script в новой базе данных.
Это отлично подходит для копирования структуры, но параметр CopyData
не работает!
Существуют ли какие-либо недокументированные лимиты для опции CopyData
? В документации только говорится, что параметр указывает, будут ли данные скопированы.
Я попытался использовать метод TransferData()
для копирования базы данных без использования script, но затем я получаю исключение, в котором говорится: "Не удалось подключиться к серверу" с внутренним исключением, которое говорит "Связанный с сетью или экземпляр- произошла ошибка при установлении соединения с SQL Server. Сервер не был найден или недоступен. Убедитесь, что имя экземпляра верное и что SQL Server настроен на разрешение удаленных подключений. (поставщик: поставщик именованных труб, ошибка: 40 - Не удалось открыть соединение с SQL Server)"
Я также попытался включить Named Pipes на сервере, но это не помогает.
Изменить: Я нашел решение, которое работает, создав резервную копию, а затем восстановив ее в новой базе данных. Это довольно неуклюже, хотя и медленнее, чем должно быть, поэтому я все еще ищу лучшее решение.