Я нашел несколько сообщений о том, как выполнить резервное копирование и восстановление базы данных с помощью сборок Sql SMO на C#. По сути, если я хочу сделать копию базы данных и дать ей новое имя, мне нужно предоставить Relocate Files при выполнении Восстановить. Файлы перемещения состоят из пути к файлу данных и пути к файлу журнала. Если я восстанавливаю существующую базу данных, я могу просто проверить свойство FileGroups объекта базы данных, чтобы получить путь к файлу данных, и его свойство LogFiles, чтобы получить путь к файлу журнала, затем измените имя файла пути, чтобы использовать новое имя базы данных, и укажите их при выполнении восстановления . Без предоставления файлов перемещения операция восстановления просто перезапишет исходную базу данных (перезапишет ее файлы .mdf (данные) и .ldf (журнал)).
Итак, у меня все работает нормально, но теперь я столкнулся со случаем, когда я хочу создать новую базу данных из файла резервной копии базы данных (.bak), который предоставляет пользователь, и они должны иметь возможность указать новое имя для базу данных. Чтобы дать базе данных новое имя и не перезаписывать существующие файлы базы данных (если они уже существуют), мне нужно знать пути к файлу данных и файлу журнала резервной копии.
Существуют ли функции SMO, которые я могу использовать для проверки файла резервной копии базы данных на наличие имени базы данных, пути к файлу данных и пути к файлу журнала? Я предполагаю, что они есть, поскольку SQL Management Studio может это сделать, но просматривая документацию MSDN, я еще не сталкивался с этим.
Заранее спасибо.
== ОТВЕТ ==
Как указано в ответе Бена Тула, ответ заключается в использовании Функция ReadFileList для объекта Restore. Вот пример кода:
Restore restore = new Restore();
restore.Devices.AddDevice(Path.GetFullPath(backupFileToRestoreFrom), DeviceType.File);
DataTable fileList = restore.ReadFileList(server);
string dataLogicalName = fileList.Rows[0][0].ToString();
string dataPhysicalName = fileList.Rows[0][1].ToString();
string logLogicalName = fileList.Rows[1][0].ToString();
string logPhysicalName = fileList.Rows[1][1].ToString();