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
函数来关闭 SqlConnection
和 SqlDataReader
。你可以传入一个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"
您好,我有以下代码
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
函数来关闭 SqlConnection
和 SqlDataReader
。你可以传入一个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"