Power SQL 与 Data.tables 一起工作

Power SQL working with Data.tables

您好,我有以下代码

function Invoke-SQL {
    param(
        [string] $dataSource = ".\SKYPE",
        [string] $database = "LcsCDR",
        [string] $sqlCommand = "SELECT * From UsersView"
      )

    $connectionString = "Data Source=$dataSource; " +
            "Integrated Security=SSPI; " +
            "Initial Catalog=$database"

    $connection = new-object system.data.SqlClient.SQLConnection($connectionString)
    $command = new-object system.data.sqlclient.sqlcommand($sqlCommand,$connection)
    $connection.Open()

    $adapter = New-Object System.Data.sqlclient.sqlDataAdapter $command
    $dataset = New-Object System.Data.DataSet
    $adapter.Fill($dataSet) | Out-Null

    $connection.Close()
    $dataSet.Tables

}

$results = Invoke-SQL 

Write-Host $results.Rows.Count

foreach ($row in $results.Rows)
{
Write-Host "value is : $($row[4])"

}

这符合我的预期,因为它拉回了 UserView table 的内容并循环遍历它,将其显示到屏幕上。一切都直截了当。

但我在输出中使用了列索引。我怎样才能首先列出 table 的列 header。然后能够使用 header 而不是索引号来循环。

所以我希望最后一行如下所示,其中 "userid" 是 header 列。

Write-Host "value is : $($row["UserID"])"

这可能吗?

哦,对不起,我知道我可以使用它们了!我花了 20 分钟尝试它并盲目地尝试使用 {} 而不是 []。一个盲目的时刻。

foreach ($row in $results.Rows)
{
Write-Host "calue is : $($row["UserID"])"

}

write-host $results.Columns

是我想要的命令。

我建议您使用我的通用 Receive-SqlQuery 函数来关闭 SqlConnectionSqlDataReader。你可以传入一个scriptblock来处理reader。

function Receive-SqlQuery
{
    Param
    (
        [string]$ConnectionString,
        [string]$SqlQuery,
        [scriptblock]$ResultProcessor
    )

    try 
    {
        $sqlConnection = New-Object System.Data.SqlClient.SqlConnection $ConnectionString
        $sqlConnection.Open()

        try
        {
            $sqlCommand = New-Object System.Data.SqlClient.SqlCommand($SqlQuery, $sqlConnection)
            $reader = $sqlCommand.ExecuteReader()
            Invoke-Command $ResultProcessor -ArgumentList $reader
        }
        finally # cleanup reader
        {
            if ($reader)
            {
                $reader.Close()
            }
        }
    }
    finally
    {
        $sqlConnection.Close();
    }
}

使用列名访问列的用法示例:

 $readerCallback = {
        Param($reader)
        while ($reader.Read()) {
            Write-Host $reader['UserID']
        }    
    }

$retrieveUsers = 
@'
SELECT * From UsersView
'@

Receive-SqlQuery -ConnectionString "yourConnectionString" -SqlQuery $retrieveUsers -ResultProcessor $readerCallback

你甚至不需要循环!

$results | Select-Object "UserID"

备选方案:

$results | Select-Object "UserID" | ForEach-Object {
    $_
}

$results | ForEach-Object {
    $_."UserID"
}

$_ 有点类似于 "this"