Как программно получить путь к резервной копии по умолчанию для SQL Server 2008 Express R2 с использованием C #? - PullRequest
3 голосов
/ 09 января 2012

У меня есть веб-приложение, которое я буду распространять среди клиентов.Я дам им возможность резервного копирования и восстановления серверной базы данных SQL Server через веб-страницу администратора.

Для резервного копирования я просто программно создаю имя файла с использованием отметок времени и позволяю SQL Server сохранить его в папке для резервного копирования по умолчанию.Для восстановления я хотел бы перечислить файлы резервных копий и позволить пользователю выбрать, какой из них использовать, но я не знаю, какая папка резервной копии по умолчанию используется для получения списка файлов.

Как программнополучить папку для резервного копирования по умолчанию для SQL Server 2008 Express R2, используя C #?

Спасибо

Ответы [ 6 ]

12 голосов
/ 09 января 2012

Чтобы получить путь резервного копирования для данного сервера, вы можете использовать объекты управления SQL Server.У объекта Server есть свойство BackupDirectory.

Вам понадобится что-то вроде этого:

Server srv = new Server("SERVERNAME");
string backUpDir = srv.BackupDirectory;

Чтобы это работало, вам необходимо импортировать ссылки / ссылки для:

Microsoft.SqlServer.Management.Smo;
Microsoft.SqlServer.Management.Common;

Более подробную информацию вы найдете здесь о том, как взаимодействовать с объектами управления SQL Server.

2 голосов
/ 09 января 2012

Попробуйте принять эту заглушку:

    private void GetSqlDefaultInfo(string InstanceName, string ServerName)
    {
        try
        {
            InstanceName = string.IsNullOrEmpty(InstanceName) ? "MSSQLSERVER" : InstanceName;

            if (string.IsNullOrEmpty(ServerName))
                ServerName = Environment.MachineName;
            using (var registryKey = RegistryKey.OpenRemoteBaseKey(RegistryHive.LocalMachine, ServerName))
            {
                object sqlInstance;
                using (var subKey = registryKey.OpenSubKey(@"SOFTWARE\Microsoft\Microsoft SQL Server\Instance Names\SQL"))
                    sqlInstance = subKey.GetValue(InstanceName);
                if (sqlInstance != null && !string.IsNullOrEmpty(sqlInstance.ToString()))
                {
                    var sqlPathKey = string.Format(@"SOFTWARE\Microsoft\Microsoft SQL Server\{0}\MSSQLServer",
                                                   sqlInstance);
                    object defaultData, defaultLog, backupDirectory, sqlPath;
                    using (var subKey = registryKey.OpenSubKey(sqlPathKey))
                    {
                        defaultData = subKey.GetValue("DefaultData");
                        defaultLog = subKey.GetValue("DefaultLog");
                        backupDirectory = subKey.GetValue("BackupDirectory");
                    }
                    sqlPathKey = string.Format(@"SOFTWARE\Microsoft\Microsoft SQL Server\{0}\Setup", sqlInstance);

                    using (var subKey = registryKey.OpenSubKey(sqlPathKey))
                        sqlPath = subKey.GetValue("SQLDataRoot");
                    DataFilePath = defaultData != null
                                       ? defaultData.ToString()
                                       : Path.Combine(sqlPath.ToString(), "Data").TrimEnd('\\');

                    LogFilePath = defaultLog != null
                                      ? defaultLog.ToString()
                                      : Path.Combine(sqlPath.ToString(), "Data").TrimEnd('\\');
                    FTSIndexFilePath = DataFilePath;
                    ContentFilePath = DataFilePath;
                    BackupFilePath = backupDirectory != null
                                         ? backupDirectory.ToString()
                                         : Path.Combine(sqlPath.ToString(), "Backup").TrimEnd('\\');
                }
            }
        } catch(Exception)
        {

        }
    }
1 голос
/ 10 января 2012

Я использовал следующую SqlCommand ... Это решение появилось в другом ответе, который по какой-то причине был стерт.В любом случае, вот команда, которую я использовал в итоге:

EXEC  master.dbo.xp_instance_regread  N'HKEY_LOCAL_MACHINE', N'Software\\Microsoft\\MSSQLServer\\MSSQLServer',N'BackupDirectory'

И вот команда в моем коде C #, которая показывает путь к папке резервной копии по умолчанию, сохраняемой в переменной backupFolder:

            SqlConnection myConnection = new SqlConnection(ConfigurationManager.ConnectionStrings["connectionString"].ConnectionString);

            SqlCommand cmd = new SqlCommand();
            SqlDataReader reader;

            cmd.CommandText = "EXEC  master.dbo.xp_instance_regread  N'HKEY_LOCAL_MACHINE', N'Software\\Microsoft\\MSSQLServer\\MSSQLServer',N'BackupDirectory'";
            cmd.CommandType = CommandType.Text;
            cmd.Connection = myConnection;
            myConnection.Open();

            SqlDataReader myDataReader = cmd.ExecuteReader();

            myDataReader.Read();
            string backupFolder = myDataReader.GetString(1);
1 голос
/ 09 января 2012

Следующий запрос должен дать вам имя физического устройства (или путь) для каждой базы данных. Вы можете адаптировать его под свои нужды:

select
    database_name,
    backup_type,
    physical_device_name -- path
from
(
    select 
        row_number() over (partition by database_name,type order by backup_start_date desc) as rownum,
        database_name,
        case type 
            when 'L' then 'Log' 
            when 'D' then 'Data'
            else '??? '+type 
        end as backup_type,
        physical_device_name
    from msdb.dbo.backupset a 
    join msdb..backupmediaset b on a.media_set_id = b.media_set_id 
    join msdb.dbo.backupmediafamily c on a.media_set_id = c.media_set_id
) x
where rownum=1
order by database_name asc, backup_type
0 голосов
/ 29 апреля 2019
declare @regread nvarchar(max)

select  top 1 @regread = substring(registry_key,6,len(registry_key)-16)
from    sys.dm_server_registry
where   registry_key like '%Parameters'
group by registry_key

select @regread = 'exec master..xp_regread ''HKEY_LOCAL_MACHINE'','''+@regread+''', ''BackupDirectory'''
exec sp_executesql @regread
0 голосов
/ 09 января 2012

Значение, которое вы ищете, хранится в реестре

Key: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\MSSQL.2\MSSQLServer
Value: BackupDirectory

Обратите внимание, что ключ зависит от имени вашего экземпляра SQL Server.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...