如何使用C#以编程方式获取SQL Server 2008 Express R2的默认备份路径?
我有一个web应用程序,我将分发给客户。我会让他们选择通过管理员网页备份和恢复后端SQL Server数据库 对于备份,我只是使用时间戳以编程方式创建一个文件名,并让SQL Server将其保存在默认备份文件夹中。对于恢复,我想列出备份文件并让用户选择使用哪一个,但我不知道获取文件列表的默认备份文件夹是什么 如何使用C#以编程方式获取SQL Server 2008 Express R2的默认备份文件夹如何使用C#以编程方式获取SQL Server 2008 Express R2的默认备份路径?,c#,sql-server-2008,C#,Sql Server 2008,我有一个web应用程序,我将分发给客户。我会让他们选择通过管理员网页备份和恢复后端SQL Server数据库 对于备份,我只是使用时间戳以编程方式创建一个文件名,并让SQL Server将其保存在默认备份文件夹中。对于恢复,我想列出备份文件并让用户选择使用哪一个,但我不知道获取文件列表的默认备份文件夹是什么 如何使用C#以编程方式获取SQL Server 2008 Express R2的默认备份文件夹 谢谢下面的查询应该为您提供每个数据库的物理设备名称(或路径)。您可以根据自己的需要进行定制:
谢谢下面的查询应该为您提供每个数据库的物理设备名称(或路径)。您可以根据自己的需要进行定制:
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
尝试采用此存根:
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)
{
}
}
您要查找的值存储在注册表中
Key: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\MSSQL.2\MSSQLServer
Value: BackupDirectory
请注意,密钥取决于SQL Server实例名称。要检索给定服务器的备份路径,可以使用SQL Server管理对象。
服务器
对象有一个名为BackupDirectory的属性
你会想要这样的东西:
Server srv = new Server("SERVERNAME");
string backUpDir = srv.BackupDirectory;
为此,您需要导入以下用途/引用:
Microsoft.SqlServer.Management.Smo;
Microsoft.SqlServer.Management.Common;
您将找到有关如何与SQL Server管理对象交互的更多信息。我最后使用了以下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);
这看起来是个不错的选择;但是,我选择不使用SQLServer管理对象,因为它似乎是一个单独的工具,我必须下载它并将其包含在分布式应用程序中。
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