2015-05-21 4 views
4

Я пытаюсь прочитать данные из таблицы SQL в сценарии powershell. Я вижу данные в объекте читателя, но, читая его с помощью While (readerobject.read()){}, он не входит в цикл.ExecuteReader() в сценарии Powershell

Powershell:

$cmd = $sqlConn.CreateCommand() 
$cmd.CommandText ="SELECT * from user" 
$movedUserDetails = $cmd.ExecuteReader() 
while ($movedUserDetails.Read()) 
    { 
     "[0] : " + $movedUserDetails.GetValue(0) 
    } 
$movedUserDetails.Close() 
+0

Это должно сработать, хотя вы нигде не сохраняете значение. Вы можете добавить его к объекту массива с '+ ='. [Вот пример] (http://blogs.msdn.com/b/buckwoody/archive/2009/04/13/run-a-sql-server-command-from-powershell-without-sql-server- provider.aspx) – KyleMit

ответ

0

Я попробовал ваш код и он работал. Возможно, вы можете попробовать с SqlDataAdapter. Я сделал этот модуль Powershell для получения записей с SQL. Это никогда не подводило меня

function Invoke-SqlSelect 
{ 
    [CmdletBinding()] 
    Param 
    ( 
     [ValidateNotNullOrEmpty()] 
     [Parameter(ValueFromPipeline=$True,Mandatory=$True)] 
     [string] $SqlServer, 
     [Parameter(ValueFromPipeline=$True,Mandatory=$False)] 
     [string] $Database = "master", 
     [ValidateNotNullOrEmpty()] 
     [Parameter(ValueFromPipeline=$True,Mandatory=$True)] 
     [string] $SqlStatement 
    ) 
    $ErrorActionPreference = "Stop" 

    $sqlConnection = New-Object System.Data.SqlClient.SqlConnection 
    $sqlConnection.ConnectionString = "Server=$SqlServer;Database=$Database;Integrated Security=True" 

    $sqlCmd = New-Object System.Data.SqlClient.SqlCommand 
    $sqlCmd.CommandText = $SqlStatement 
    $sqlCmd.Connection = $sqlConnection 

    $sqlAdapter = New-Object System.Data.SqlClient.SqlDataAdapter 
    $sqlAdapter.SelectCommand = $sqlCmd 
    $dataTable = New-Object System.Data.DataTable 
    try 
    { 
     $sqlConnection.Open() 
     $sqlOutput = $sqlAdapter.Fill($dataTable) 
     Write-Output -Verbose $sqlOutput 
     $sqlConnection.Close() 
     $sqlConnection.Dispose() 
    } 
    catch 
    { 
     Write-Output -Verbose "Error executing SQL on database [$Database] on server [$SqlServer]. Statement: `r`n$SqlStatement" 
     return $null 
    } 


    if ($dataTable) { return ,$dataTable } else { return $null } 
} 
4

Синтаксис верен, но вы ничего не делаете со значением один раз внутри цикла. Вы хотите как-то упорствовать. Ниже приведен пример запуска базового SQL внутри powershell с двумя различными типами команд (Text/SP) и двумя различными способами выполнения (DataAdapter/DataReader). Любой из них должен работать нормально.

# config 
$svr = "serverName" 
$db = "databaseName" 

# connection 
$sqlConnection = New-Object System.Data.SqlClient.SqlConnection 
$sqlConnection.ConnectionString = "Server=$svr;Database=$db;Integrated Security=True" 
$sqlConnection.Open() 

# command A - text 
$sqlCmd = New-Object System.Data.SqlClient.SqlCommand 
$sqlCmd.Connection = $sqlConnection 
$sqlCmd.CommandText = "SELECT name AS TABLE_NAME FROM sys.tables" 

# command B - stored procedure 
$sqlCmd = New-Object System.Data.SqlClient.SqlCommand 
$sqlCmd.Connection = $sqlConnection 
$sqlCmd.CommandText = "sys.sp_tables" 
$sqlCmd.CommandType = [System.Data.CommandType]::StoredProcedure 
$sqlCmd.Parameters.Add("@table_owner", "dbo") 

# execute A - data reader 
$reader = $sqlCmd.ExecuteReader() 
$tables = @() 
while ($reader.Read()) { 
    $tables += $reader["TABLE_NAME"] 
} 
$reader.Close() 

# execute B - data adapter 
$dataTable = New-Object System.Data.DataTable 
$sqlAdapter = New-Object System.Data.SqlClient.SqlDataAdapter 
$sqlAdapter.SelectCommand = $sqlCmd 
$sqlAdapter.Fill($dataTable) 
$sqlConnection.Close() 
1

У меня был точно такой же вопрос, и я считаю, что причина заключается в следующем (работал для меня):

Соединение с базой данных не всегда закрыта правильно например в случае ошибки. Если он не закрыт, он пропускает цикл while. Измените код на следующее:

 $sqlConn.Open() 
    $cmd = $sqlConn.CreateCommand() 
    $cmd.CommandText ="SELECT * from user" 
    $movedUserDetails = $cmd.ExecuteReader() 
    try 
    { 
     while ($movedUserDetails.Read()) 
     { 
      "[0] : " + $movedUserDetails.GetValue(0) 
     } 
    } 
    catch 
    { 
     #log error 
    } 
    finally 
    { 
     $sqlConn.Close() 
    } 

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

Смежные вопросы