我需要得到目前的计算机上的SQL Server实例的列表,获取的每个实例数据库列表,然后确定每个数据库都多少空间占用。
我可以很容易地从注册表抢实例名称,但我没有访问查询表,以获得数据库的名称。 是否有这样做的另一种方式,也许虽然WMI?
我需要得到目前的计算机上的SQL Server实例的列表,获取的每个实例数据库列表,然后确定每个数据库都多少空间占用。
我可以很容易地从注册表抢实例名称,但我没有访问查询表,以获得数据库的名称。 是否有这样做的另一种方式,也许虽然WMI?
一些周围挖之后,我终于找到了WMI类,将让我我需要的信息。 在这里我的SQL Server实例3的服务器,我发现我的数据在以下类
Win32_PerfFormattedData_MSSQLINST2_MSSQLINST2Databases
Win32_PerfFormattedData_MSSQLINST3_MSSQLINST3Databases
Win32_PerfFormattedData_MSSQLSERVER_SQLServerDatabases
我的情况是MSSQLINST2
, MSSQLINST3
和MSSQLSERVER
。 我无法弄清楚的命名方案,所以我不得不看,虽然所有类,找出我需要的信息。 总之,这里是一个的工作代码。 也许有人会觉得它有用。
ManagementObjectSearcher sqlInstancesSearcher = new ManagementObjectSearcher(
new ManagementScope(@"Root\Microsoft\SqlServer\ComputerManagement10"),
new WqlObjectQuery("select * from SqlServiceAdvancedProperty where propertyindex = 12"),
null);
foreach (ManagementObject instance in sqlInstancesSearcher.Get())
{
string instanceName = instance["ServiceName"].ToString().Replace("$", String.Empty);
Console.WriteLine("INSTANCE: " + instanceName);
ManagementObjectSearcher classNameSearcher = new ManagementObjectSearcher(
new ManagementScope(@"root\cimv2"),
new WqlObjectQuery("select * from meta_class where __CLASS Like 'Win32_PerfFormattedData_" + instanceName + "%Databases%'"),
null);
foreach (ManagementClass wmiClass in classNameSearcher.Get())
{
string className = wmiClass["__CLASS"].ToString();
string query = "select * from " + className;
ManagementObjectSearcher databaseSearcher = new ManagementObjectSearcher(
new ManagementScope(@"root\cimv2"),
new WqlObjectQuery(query),
null);
foreach (ManagementObject database in databaseSearcher.Get())
{
Console.WriteLine(" " + database["Name"]);
Console.WriteLine(" Data Files : " + database["DataFilesSizeKB"]);
Console.WriteLine(" Log Files : " + database["LogFilesSizeKB"]);
Console.WriteLine(" Log Files Used : " + database["LogFilesSizeKB"]);
}
}
}