Команда Sql (Исключение вызывает "ExecuteScalar" с аргументом "0") - PullRequest
2 голосов
/ 04 марта 2010

Когда я запускаю приведенный ниже код с первой попытки, я получаю необъяснимую ошибку, но повторный запуск сценария со второй попытки работает нормально ... что будет неправильно в моем коде?

Кстати, я создаю базу данных до этого шага ...

  $SqlConnection = New-Object System.Data.SqlClient.SqlConnection
  $SqlConnection.ConnectionString = "Server=$dBServer;Database=$dBName;Integrated Security=True" 
  $SqlConnection.Open() 

  $SqlCmd = New-Object System.Data.SqlClient.SqlCommand 
  $SqlCmd.CommandText = $dBCmd 
  $SqlCmd.Connection = $sqlConnection 

  $execute = $SqlCmd.ExecuteScalar() 
  $SqlConnection.Close() 

Ошибка

Exception calling "ExecuteScalar" with "0" argument(s): "A transport-level error has occurred when sending the request to the server. (provider: Shared Memory  Provider, error: 0 - No process is on the other end of the pipe.)" At c:\scripts\DB\Powershell\RunSql.ps1:61 char:34
+   $execute = $sqlCmd.ExecuteScalar <<<< ()
    + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
    + FullyQualifiedErrorId : DotNetMethodException

Ответы [ 5 ]

5 голосов
/ 05 марта 2010

Это распространенная ошибка, которая возникает, если вы пытаетесь выполнить команду, используя соединение, которое было сброшено сервером. Это происходит со мной все время, когда я запускаю скрипт Powershell, перезагружаю SQL Server, а затем снова пытаюсь запустить скрипт. Сценарий считает, что соединение все еще открыто, но когда он пытается его использовать, вы получаете ошибку транспортного уровня, и он закрывает соединение. При повторном запуске сценария он снова установит соединение, и все работает нормально.

Если вы хотите принудительно закрыть соединение, просто выполняйте оператор $ SqlConnection.Close () каждый раз, когда вы перезапускаете сервер SQL.

0 голосов
/ 19 января 2017

У меня была такая же проблема, мне удалось ее решить, переместив строку подключения в ту же строку, где создается экземпляр подключения.

$SqlConnection = New-Object System.Data.SqlClient.SqlConnection $conString

Не знаю почему, но назначение его потом не работает. Возможно, кто-то может пролить свет на то, почему?

0 голосов
/ 21 марта 2012

Я думаю, что вы можете заставить его перейти прямо к tcp (1433) и пропустить создание соединения по именованным каналам, используя

"Сервер = $ dBServer, 1433; База данных = $ dBName; Интегрированная безопасность = Истина"

Многие библиотеки, клиенты сначала пробуют именованные каналы, но, как правило, рекомендуется только прослушивать 1433 на вашей цели.Я думаю, что код Ози тоже работает ... это простая попытка именованных каналов, ошибка, попытка 1433, которая является стандартным способом, которым часто работают MS.Вы можете попробовать fussign с сетевыми библиотеками и т. Д., Как уже описывали другие, но использование правильной строки conn обычно является хорошей идеей, чтобы вы знали, какой порт вы используете для брандмауэров и т. Д.

0 голосов
/ 05 марта 2010

В моем странном случае, в конце концов, я пришел к приемлемому решению, используя переменную $ error вместо ($ LastExitCode или $?), Чтобы обнаружить ошибку запроса sql и выполнить цикл для пары попыток, поскольку мой код работает после второй попытки.

$attempts = 0
$maxAttempts = 3

  while ($attempts -lt $maxAttempts)
  {
    $attempts++
    $error.clear() # Clears teh error variable incase of any previous errors in the script

      $SqlConnection = New-Object System.Data.SqlClient.SqlConnection 
      $SqlConnection.ConnectionString = "Server=$dBServer;Database=$dBName;Integrated Security=True"  
      $SqlConnection.Open()  

      $SqlCmd = New-Object System.Data.SqlClient.SqlCommand  
      $SqlCmd.CommandText = $dBCmd  
      $SqlCmd.Connection = $sqlConnection  

      $execute = $SqlCmd.ExecuteScalar()  
      $SqlConnection.Close()  

      if ($error.count -eq 0)
      {
        write-host "Sql Query was Successful."            
        break
      }        

      else
      {   
        write-host "Sql Query failed on attempt $attempts"
        $error.clear()
      }
  }
0 голосов
/ 04 марта 2010

Проверяли ли вы диспетчер конфигурации SQL Server, чтобы убедиться, что «Именованные каналы» включены (в разделе «Конфигурация сети SQL Server -> Протоколы для SQL ...»)?

...