Powershell脚本中的ExecuteReader()

Gee*_*eth 7 sql powershell ado.net executereader

我正在尝试从PowerShell脚本中读取SQL表中的数据.我可以在reader对象中看到数据,但是在使用While (readerobject.read()){}它时,它不会进入循环内部.

Powershell:

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

Kyl*_*Mit 7

语法是正确的,但是在循环中你没有对值做任何事情.你会想以某种方式坚持下去.下面是在PowerShell中运行一些基本SQL的示例,它有两种不同类型的命令(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()
Run Code Online (Sandbox Code Playgroud)

  • 我会使用`$tables = while ($reader.Read()) { $reader["TABLE_NAME"] }`。在 PowerShell 中,数组连接是一个 O(n) 复杂度操作,因此将输出连接到数组的循环自动是 O(n^2) 复杂度。 (2认同)

Rub*_*nov 2

下面的答案是但已经过时了。您现在应该使用Invoke-Sqlcmd

Invoke-Sqlcmd -Query $sqlStatement -ConnectionString $ConnectionString;
Run Code Online (Sandbox Code Playgroud)

您可能需要执行 aInstall-Module -Name SqlServer才能安装它。


如果您不想安装该SqlServer模块或者您的 Powershell 版本为 2 或更低,您可以尝试使用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 }
}
Run Code Online (Sandbox Code Playgroud)