Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何获取特定计算机的SqlInstances列表_C#_Sql Server_.net 2.0_Wmi_Smo - Fatal编程技术网

C# 如何获取特定计算机的SqlInstances列表

C# 如何获取特定计算机的SqlInstances列表,c#,sql-server,.net-2.0,wmi,smo,C#,Sql Server,.net 2.0,Wmi,Smo,有人能告诉我如何使用c#和SMO或任何api获取远程Sqlserver实例吗 我有一个远程服务器名“RemoteMC”,它有两个sql server实例:“RemoteMC”和“RemoteMC\sqlexpress” 我尝试用如下代码获取实例: Server srv=new Server("RemoteMC"); DataTable dt=SmoApplication.EnumAvailableSqlServer(true); 但它返回“Host\sqlexpress” 我不知道出了什么问题

有人能告诉我如何使用c#和SMO或任何api获取远程Sqlserver实例吗

我有一个远程服务器名“RemoteMC”,它有两个sql server实例:“RemoteMC”和“RemoteMC\sqlexpress”

我尝试用如下代码获取实例:

Server srv=new Server("RemoteMC");
DataTable dt=SmoApplication.EnumAvailableSqlServer(true);
但它返回“Host\sqlexpress”

我不知道出了什么问题。如何将结果返回为:

RemoteMC
RemoteMC\sqlexpress


一种方法是读取本地计算机下的注册表项“Software\Microsoft\Microsoft SQL Server\Instance Names\SQL\”。允许您读取解决方案中的注册表吗?

一种方法是读取本地计算机下的注册表项“Software\Microsoft\Microsoft SQL Server\Instance Names\SQL\”。允许您读取解决方案中的注册表吗?

您正在寻找的是
SMO应用程序。EnumAvailableSqlServers
方法。有3个重载,其中一个重载使用
string
参数作为服务器名称

它返回一个
数据表
,其行具有类似
版本
名称
IsLocal等字段

您需要添加对SMO库的引用,并且可能希望在C#文件的顶部有“
using Microsoft.SqlServer.Management.SMO;

有关SQLSMO的介绍,请参阅

编辑:一些代码用于解决此特定问题(我没有编译或运行此代码):

编辑:。将行添加到foreach以便它可以编译

DataTable dataTable = SmoApplication.EnumAvailableSqlServers(false);

foreach (DataRow dataRow in dataTable.Rows)
{
    if ((dataRow["Server"] as string) == "MyServerName")
        Console.WriteLine(dataRow["Instance"] as string);
}

SmoApplication.EnumAvailableSqlServers
方法就是您要寻找的。有3个重载,其中一个重载使用
string
参数作为服务器名称

它返回一个
数据表
,其行具有类似
版本
名称
IsLocal等字段

您需要添加对SMO库的引用,并且可能希望在C#文件的顶部有“
using Microsoft.SqlServer.Management.SMO;

有关SQLSMO的介绍,请参阅

编辑:一些代码用于解决此特定问题(我没有编译或运行此代码):

编辑:。将行添加到foreach以便它可以编译

DataTable dataTable = SmoApplication.EnumAvailableSqlServers(false);

foreach (DataRow dataRow in dataTable.Rows)
{
    if ((dataRow["Server"] as string) == "MyServerName")
        Console.WriteLine(dataRow["Instance"] as string);
}
使用内置方式

System.Data.Sql.SqlDataSourceEnumerator
使用内置方式

System.Data.Sql.SqlDataSourceEnumerator

使用该选项,我只能获取本地Sql发现。我如何才能进行远程Sql发现。这意味着我可以运行应用程序,然后它应该针对指定的计算机并将信息检索到我的本地计算机。如果我使用EnumAvailableSqlServers(true)只有当我传递字符串时,它才会给出本地。只有当另外2个远程实例存在时,才会出现远程实例。Hmmm。。。你说得对。我的计算机上有两个实例,一个SQL 2000实例称为“MYMACHINE”,另一个SQL 2005实例称为“MYMACHINE\MYSQL2005”。如果我通过“我的机器”,我只得到一个实例。我认为问题在于,您可以传入服务器名或实例名,在这种情况下,服务器名恰好也是实例名,EnumAvailableServers正在执行它通常对实例名执行的操作,即仅返回有关该实例的信息。或者,您可以使用接受布尔参数的重载,并传入false(不只是本地实例)。这将为您提供一个包含所有本地可访问实例的大表,并且您可以在服务器列上进行筛选。这并不理想,因为构建列表可能需要更长的时间。使用dataTable的属性,我可以很好地获得非本地实例,但我必须同时获得特定机器的命名实例和默认实例。假设在这种情况下,如果我给MyMachine作为参数,我必须得到MyMachine和MyMachine\MySQL2005,我需要和其他网络实例,我不需要如何做,Gary…..有什么想法吗???根据我上面的评论,我想你不能将机器名作为参数传递。传错。这将为您提供所有实例(在所有计算机上),并且您必须检查每一行结果,以查看它在哪个服务器上以及该实例被调用。如果调用EnumAvailableSqlServers(false)并检查返回的数据表中的行,希望您能明白我的意思。使用它,我只能获取本地Sql发现。我如何才能进行远程Sql发现。意味着我可以运行应用程序,然后它应该针对指定的计算机并将信息检索到本地计算机。如果我使用EnumAvailableSqlServers(true)只有当我传递字符串时,它才会给出本地。只有当另外2个远程实例存在时,才会出现远程实例。Hmmm。。。你说得对。我的计算机上有两个实例,一个SQL 2000实例称为“MYMACHINE”,另一个SQL 2005实例称为“MYMACHINE\MYSQL2005”。如果我通过“我的机器”,我只得到一个实例。我认为问题在于,您可以传入服务器名或实例名,在这种情况下,服务器名恰好也是实例名,EnumAvailableServers正在执行它通常对实例名执行的操作,即仅返回有关该实例的信息。或者,您可以使用接受布尔参数的重载,并传入false(不只是本地实例)。这将为您提供一个包含所有本地可访问实例的大表,并且您可以在服务器列上进行筛选。这并不理想,因为构建列表可能需要更长的时间。使用dataTable的属性,我可以很好地获得非本地实例,但我必须同时获得特定机器的命名实例和默认实例。假设在这种情况下,如果我给MyMachine作为参数,我必须得到MyMachine和MyMachine\MySQL2005,我需要和其他网络实例,我不需要如何做,Gary…..有什么想法吗???根据我上面的评论,我想你不能将机器名作为参数传递。传错。这会给你所有的机会