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

Can't connect to SQL Server database server on port 1433

我正在尝试开始为任务编写 PowerShell SQL 查询脚本,但在此之前我正在测试以确保我的数据库连接正常工作。

我已经使用 SSMS 17 在 SQL 服务器中创建了一个 table,并且作为连接测试的一部分,我正在测试我是否可以在端口 1433(这是也在防火墙规则中打开)。

这是我用来测试与 SQL 服务器的端口连接的片段:

$port   = 1433

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

其中 $dbhost = myservername.domain.com

每次我运行脚本它returns:

not connected

这是为什么?

我检查了 SSMS 中的服务器产品,它使用

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

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

的一部分

您可能没有及时连接,但正在尝试检查当前状态是否已连接。尝试对 Net.Sockets.TcpClient class 使用 BeginConnect 方法,它有 timeout 选项可能对您有帮助。我已经修复了你的代码:

$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()

Net.Sockets.TcpClient.Connect method returns 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'
}