无法在端口1433上连接到SQL Server数据库服务器

时间:2018-09-07 04:25:33

标签: sql-server powershell tcp enterprise ssms-2017

我试图开始为任务执行PowerShell SQL查询脚本,但是在此之前,我正在测试以确保数据库连接正常。

我已经使用SSMS 17在SQL Server中创建了一个表,作为连接测试的一部分,我正在测试是否可以在端口1433(在防火墙规则中也打开)上正常连接到数据库服务器。

这是我用来测试与SQL Server的端口连接的代码段:

$port   = 1433

$tcp = New-Object Net.Sockets.TcpClient
if ([void]$tcp.Connect($dbhost, $port)) {
  'connected'
} else {
  'not connected'
}
$tcp.Dispose()

其中$dbhost = myservername.domain.com

每次运行脚本时,它都会返回:

  

未连接

那是为什么?

我在SSMS中检查了服务器产品,并使用

Microsoft SQL Server Enterprise: Core-based Licensing (64-bit)

之所以这么说是因为一些在线解决方案提到了服务器和实例,并且如果我拥有SQL Server Express,则必须将Express列为主机名或其他内容。但是我使用的是企业版...所以我猜它是默认的MSSQLServer,不必将其指定为dbhostname的一部分

2 个答案:

答案 0 :(得分:0)

您可能没有及时连接,但尝试检查当前是否连接了状态。尝试对BeginConnect类使用Net.Sockets.TcpClient方法,该方法具有超时选项,可能会对您有所帮助。我已经修复了您的代码:

$port   = 1433
$timeout = 1000 #ms

$tcp = New-Object Net.Sockets.TcpClient
$wait = $tcp.BeginConnect($dbhost,$port,$null,$null)
[void]$wait.AsyncWaitHandle.WaitOne($timeout,$false)
if ($tcp.Connected) {
  'connected'
} else {
  'not connected'
}
$tcp.Close()
$tcp.Dispose()

答案 1 :(得分:0)

Net.Sockets.TcpClient.Connect method返回void,因此PowerShell if语句将永远不会评估为$true。改为在连接后检查Net.Sockets.TcpClient.Connected属性:

$port   = 1433

$tcp = New-Object Net.Sockets.TcpClient
$tcp.Connect($dbhost, $port)
if ($tcp.Connected) {
  'connected'
} else {
  'not connected'
}
$tcp.Dispose()

请注意,如果连接尝试失败,则会引发异常,因此if是多余的。您可以改用try / catch:

$port   = 1433

$tcp = New-Object Net.Sockets.TcpClient
try {
    $tcp.Connect($dbhost, $port)
    $tcp.Dispose()
    'connected'
} catch [System.Net.Sockets.SocketException] {
    $_.Exception.ToString()
    'not connected'
}