如何从连接字符串中获取服务器名称(仅没有 SQL Server 实例)

本文关键字:SQL 实例 Server 连接 字符串 服务器 获取 | 更新日期: 2023-09-27 18:30:38

我想测试是否存在带有tcp套接字的SQL Server(如果服务器不存在,则速度更快)。

如果连接字符串如下所示:

name="DefaultConnection" 
connectionString="Data Source=COMPUTERNAME'SQLSERVERNAME;Initial Catalog=TestDb;Integrated Security=False;User ID=sa;Password=1234;MultipleActiveResultSets=True"/>

我想使用这种方法:

public bool CheckServerAvailablity(string sServerAddressOrName)
{
        try
        {
             string connectString = ConfigurationManager.ConnectionStrings["DefaultConnection"].ConnectionString;
            SqlConnectionStringBuilder builder = new SqlConnectionStringBuilder(connectString);
            // Retrieve the DataSource property.    
            string sServerAddressOrName = builder.DataSource;
            int port = 1433;
            IPHostEntry ipHostEntry = Dns.GetHostEntry(sServerAddressOrName);
            IPAddress ipAddress = ipHostEntry.AddressList[0];
            TcpClient TcpClient = new TcpClient();
            TcpClient.Connect(ipAddress, port);
            TcpClient.Close();
            return true;
        }
        catch
        {
            return false;
        }
    } 

问题是:sServerAddressOrName = COMPUTERNAME'SQLSERVERNAME,但我只需要COMPUTERNAME

那么,问题是如何只获得COMPUTERNAME

提前感谢!

如何从连接字符串中获取服务器名称(仅没有 SQL Server 实例)

您可以使用

Split()函数来实现,例如

string sServerAddressOrName = builder.DataSource.Split('''')[0];

SqlConnectionStringBuilderDataSource 属性获取要连接到的 SQL Server 实例的名称/网络地址。

在您的情况下,它是计算机的主机名和 SQL Server 实例名称,用 ' 分隔。

如果您只需要在此特定场景中工作的内容,则可以访问DataSource并在'字符上拆分字符串,如下所示:

String myConnectionString = "Data Source=COMPUTERNAME''SQLSERVERNAME;Initial Catalog=TestDb;Integrated Security=False;User ID=sa;Password=1234;MultipleActiveResultSets=True";
var builder = new SqlConnectionStringBuilder(myConnectionString);
String hostname = builder.DataSource.Split(new Char[] { '''' })[0]);

也就是说,上述方法并不完全通用,并且不适用于更复杂的DataSource值。

由于不能在 SQL Server 实例名称中使用',因此我们可以利用此信息生成稍微好一点的解决方案:

var builder = new SqlConnectionStringBuilder(connectionString);
Int32 length = builder.DataSource.LastIndexOf('''');
Int32 start = builder.DataSource.LastIndexOf('''', length - 1) + 1;
if (start == length) { start = 0; } else { length -= start; }
var hostname = builder.DataSource.Substring(start, length);

但是,我应该补充一点,如果使用命名管道 ( ''COMPUTERNAME'pipe'pipeName )、端口号 ( COMPUTERNAME:1433 ) 或强制 TCP 参数(即 tcp:COMPUTERNAME)。