-1

我正在尝试为一项任务编写 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 的一部分

4

2 回答 2

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()
于 2018-09-07T06:33:13.023 回答
0

Net.Sockets.TcpClient.Connect方法返回void,因此 PowerShellif语句永远不会计算为$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'
}
于 2018-09-07T10:50:00.390 回答