无法连接到端口 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'
}
我正在尝试开始为任务编写 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'
}