【问题标题】:how to loop through datatable in powershell?如何在powershell中循环遍历数据表?
【发布时间】:2016-09-20 09:16:53
【问题描述】:

我在从数据表中获取数据时遇到了不同的错误。这是我填充数据表的代码:

$dt = New-Object System.Data.DataTable
$dt.Columns.Add("ServiceName")
$dt.Columns.Add("HostName")

$SQLConnection.Open()
$Reader = $SqlCmd.ExecuteReader()
while ($Reader.Read()) {
    $dt.Rows.Add($Reader.GetValue(0), $Reader.GetValue(1))
}
$SqlConnection.Close()
return $dt

上面的代码在一个返回数据表的函数中,当我在调用脚本中访问这个返回的数据表时,我没有得到数据。

获取每一行数据的脚本:

foreach ($Row in $BackupData) {
    Write-Host "$Row[0]"
    Write-Host "$Row[1]"
}

我得到如下输出:

服务名称[0]
主机名[0]
System.Data.DataRow[0]
System.Data.DataRow[0]
System.Data.DataRow[0]
System.Data.DataRow[0]

当我使用"$($Row[0])" 时,我得到另一个错误

无法索引 system.Data.DataColumn 类型的对象

如何获取每一行每一列的数据?

【问题讨论】:

  • $BackupData$BackupData | Format-Table -AutoSize 怎么样?
  • foreach ($row in $dt) { write-host $row[0] write-host $row[1] } 如果在填充数据的函数中执行此操作,但确实如此不适用于从该函数返回的相同数据表。
  • 您使用的是哪个版本的 SQL?会有PSSnapinModule 可以让这更容易。

标签: sql powershell datatable


【解决方案1】:

在 SqlDataAdapter 的帮助下填充 DataTable 要容易得多,如下所示:

$dt = New-Object System.Data.DataTable
$da = New-Object System.Data.SqlClient.SqlDataAdapter -ArgumentList $ConnectionString, $SqlQuery
$da.fill($dt)

因此,您也不必关心打开和关闭连接以及使用 SqlDataReader。

所有行现在都是 DataTable 对象 $dt 的一部分,并且可以使用行索引和特定字段名称来访问

$dt[0].FieldName

其中“FieldName”是该表的字段名称。或者不必知道特定字段的名称

$dt.Row[0}[0]

错误的原因是您必须使用带有 Write-Host 的子表达式,如下所示:

Write-Host "value of first field: $($Row[0])"

【讨论】:

    猜你喜欢
    • 2012-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-07
    • 1970-01-01
    相关资源
    最近更新 更多