这快把我逼疯了.我有一个来自多个脚本的库,其中包含以下函数:

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]
}

问题是,出于某种原因,从这里返回的是Rows collection of the table,而不是table本身.这会导致如上编写的foreach行循环失败,并显示"无法索引到空数组".例外情况.经过多次试错后,我发现这是可行的:

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

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

return $ds.Tables[0]

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

我猜显然是Powershell函数的工作方式导致了这种情况,但我不知道是什么原因.

推荐答案

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

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

基本上,您无法阻止PowerShell展开数组/集合.您所能做的最好的方法是通过将数组/集合包装到另一个单元素数组中来解决该行为.

Database相关问答推荐

TYPO3 OOPS,出现错误!编码:202402180809040864ba5c

我们可以出于不同目的在同一 postgres 数据库上同时进行物理和逻辑复制吗?

用于存储人与聊天消息的数据库设计

当我们需要触发程序的返回值时?

PostgreSQL 嵌套 INSERTs / WITHs 用于外键插入

更新列的子字符串

如何产生幻读?

从 postgresql 转储文件填充 MySQL 数据库

在 SQL Server 2008 中区分两个表架构的最简单方法是什么?

PostgreSQL 哈希索引

Oracle:如何在 Oracle SQL 中将十六进制转换为十进制?

QSqlDatabase & QSqlQuery 的正确方法是什么?

如何处理数据库中用户的身份验证/授权?

在将字符串插入数据库期间单引号转义

显式事务回滚是否必要?

数据库触发器的命名约定

用 SQL 进行条件插入?

Select 多模型 DBMS 时要考虑哪些因素? (OrientDB 与 ArangoDB)

什么是提交日志(log)?

为什么 OODBMS 不像 RDBMS 那样普遍?