2012-01-09 3 views
2

私は、顧客に配布するWebアプリケーションを用意しています。管理者のWebページを使用してバックエンドSQL Serverデータベースをバックアップおよび復元するオプションを提供します。C#を使用してSQL Server 2008 Express R2のデフォルトのバックアップパスをプログラムで取得するにはどうすればよいですか?

バックアップの場合、私はプログラムでタイムスタンプを使用してファイル名を作成し、SQL Serverがデフォルトのバックアップフォルダに保存するようにしました。復元するには、バックアップファイルをリストして、ユーザーにどちらを使用するかを選択させたいが、デフォルトのバックアップフォルダがファイルリストを取得することはわからない。

C#を使用してSQL Server 2008 Express R2の既定のバックアップフォルダをプログラムで取得する方法はありますか。

おかげ

答えて

1

私は次の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

次のクエリはあなたに各データベースの物理デバイス名(またはパス)を与える必要があります。あなたは、あなたのニーズに合わせてそれを調整することができます:このスタブを採用する

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 
2

試してみてください。

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) 
     { 

     } 
    } 
0

あなたが探している値があること、レジストリ

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

ノートに保存されていますキーはSQL Serverのインスタンス名によって異なります。

10

特定のサーバーのバックアップパスを取得するには、SQL Server管理オブジェクトを使用できます。 ServerオブジェクトにはBackupDirectoryというプロパティがあります。

あなたはこのような何かをお勧めします:あなたが対話する方法についての詳細はhereれています

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

:あなたがのためにusings /参照をインポートする必要があります動作するように

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

このためにSQL Server管理オブジェクトを使用します。

+1

良いオプションです。しかし、私はSQL Server Management Objectsを使用しないことを選択しました。これは、ダウンロードして分散アプリケーションに含める必要がある別のツールのようです。 –

関連する問題