Не удается подключиться к серверу базы данных SQL Server через порт 1433 - PullRequest
0 голосов
/ 07 сентября 2018

Я пытаюсь запустить сценарий SQL-запросов PowerShell для задачи, но перед этим я проверяю, работает ли соединение с БД.

Я уже создал таблицу в SQL Server, используя SSMS 17, и в рамках проверки соединения я проверяю, могу ли я нормально подключиться к серверу базы данных через порт 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, которое не нужно указывать как часть имени dbhost

Ответы [ 2 ]

0 голосов
/ 07 сентября 2018

Метод Net.Sockets.TcpClient.Connect возвращает 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'
}
0 голосов
/ 07 сентября 2018

Возможно, вы не подключились вовремя и все еще пытаетесь проверить, подключено ли состояние в данный момент. Попробуйте использовать BeginConnect метод для Net.Sockets.TcpClient класса, у него есть опция 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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...