如何从连接字符串中获取服务器名称(仅在没有 SQL 服务器实例的情况下)
How to get server name (only without SQL Server instance) from connection string
我想测试 SQL 服务器是否存在带 tcp 套接字(如果服务器不存在则速度更快)。
如果连接字符串是这样的:
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
?
提前致谢!
您可以使用 Split()
功能,例如
string sServerAddressOrName = builder.DataSource.Split('\')[0];
DataSource
property of SqlConnectionStringBuilder
获取要连接的 SQL 服务器实例的 name/network 地址。
在您的例子中,它是机器的主机名和 SQL 服务器实例名称,用 \
.
分隔
如果您只需要在这种特定情况下工作的东西,您可以访问 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
.
的更复杂的值
Since you can't use \
in a SQL Server instance name,我们可以利用这些信息来生成 稍微 更好的解决方案:
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
)。
我想测试 SQL 服务器是否存在带 tcp 套接字(如果服务器不存在则速度更快)。
如果连接字符串是这样的:
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
?
提前致谢!
您可以使用 Split()
功能,例如
string sServerAddressOrName = builder.DataSource.Split('\')[0];
DataSource
property of SqlConnectionStringBuilder
获取要连接的 SQL 服务器实例的 name/network 地址。
在您的例子中,它是机器的主机名和 SQL 服务器实例名称,用 \
.
如果您只需要在这种特定情况下工作的东西,您可以访问 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
.
Since you can't use \
in a SQL Server instance name,我们可以利用这些信息来生成 稍微 更好的解决方案:
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
)。