我试图开始为任务执行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的一部分
答案 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'
}