gpt4 book ai didi

database - PowerShell 函数返回 DataSet/DataTable 的奇怪行为

转载 作者:太空狗 更新时间:2023-10-30 01:40:17 30 4
gpt4 key购买 nike

这让我发疯。我有一个来自多个脚本的库,其中包含以下函数:

function lib_open_dataset([string] $sql) {
$ds = new-object "System.Data.DataSet"
$da = new-object "System.Data.SqlClient.SqlDataAdapter" ($sql, $_conn_string)

$record_count = $da.Fill($ds)

return $ds
}

这几乎在任何地方都被调用并且它工作得很好,除了我通常必须这样做:

$ds = lib_open_dataset($some_sql)
$table = $ds.Tables[0]
foreach ($row in $table.Rows) {
# etc
}

所以我创建了一个新的简单包装函数来避免取消引用第一个表的额外步骤:

function lib_open_table([string] $sql) {
$ds = lib_open_dataset $sql
return $ds.Tables[0]
}

问题是出于某种原因,从这里返回的是表的行集合,而不是 本身。这会导致如上编写的 foreach 行循环失败,并显示“无法索引到空数组”。异常(exception)。经过反复试验,我发现这是可行的:

foreach ($row in $table) {
# etc
}

注意 $table.Rowsforeach 语句中的 $table 之间的区别。这有效。因为 $table 实际上指向的是 Rows 集合。如果声明

return $ds.Tables[0]

应该是正确的,为什么函数返回表对象的子集合而不是表本身?

我猜 Powershell 函数的工作方式显然是造成这种情况的原因,但我无法弄清楚是什么。

最佳答案

您可以使用逗号运算符将行集合包装在一个数组中,这样当展开数组时您将得到原始的行集合,例如:

function lib_open_table([string] $sql) {
$ds = lib_open_dataset $sql
return ,$ds.Tables[0]
}

从本质上讲,您无法阻止 PowerShell 展开数组/集合。您可以做的最好的事情是通过将数组/集合包装在另一个单个元素数组中来解决该行为。

关于database - PowerShell 函数返回 DataSet/DataTable 的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1918190/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com