【发布时间】:2016-04-19 09:22:15
【问题描述】:
我正在尝试将 DataTable 嵌套在 Powershell 脚本中。 考虑一个非常简单的数据表:
$somedt = New-Object System.Data.DataTable
[void]$somedt.Columns.Add('foo')
[void]$somedt.Columns.Add('bar')
[void]$somedt.Rows.Add('boo', 'bah')
[void]$somedt.Rows.Add('typed', 'better')
$somedt.gettype()
IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True True DataTable System.ComponentModel.MarshalByValueComponent
我想将此作为另一个数据表中的值。所以让我们创建一个:
$dt = New-Object System.Data.DataTable
[void]$dt.Columns.Add('Title')
$dtcol = New-Object System.Data.DataColumn
$dtcol.ColumnName = "TableData"
$dtcol.DataType = "System.Data.DataTable"
$dtcol.DefaultValue = New-Object System.Data.DataTable
[void]$dt.Columns.Add($dtcol)
[void]$dt.Rows.Add("Orange")
[void]$dt.Rows.Add("Red")
$dt | Format-Table -AutoSize
Title TableData
----- ---------
Orange {}
Red {}
我们验证:
$dt.Columns["TableData"].DataType
IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True True DataTable System.ComponentModel.MarshalByValueComponent
和
$dt.Rows[1].TableData.gettype()
IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True True DataTable System.ComponentModel.MarshalByValueComponent
所以现在我验证 $somedt 的类型并创建一个新的 DataRow,其中包含 $somedt 作为它的 'TableData' 值:
$somedt.gettype()
$myrow = $dt.NewRow()
$myrow["Title"] = 'Blue'
$myrow["TableData"] = $somedt
$myrow
IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True True DataTable System.ComponentModel.MarshalByValueComponent
值类型与列类型不匹配无法存储在 TableData 列中。预期类型是 DataTable。 在行:5 字符:1 + $myrow["TableData"] = $somedt + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : OperationStopped: (:) [], ArgumentException + FullyQualifiedErrorId : System.ArgumentException
Title : Blue
TableData : {}
那么为什么会失败呢?似乎 Powershell 采用 DataTable 并将其转换为 DataRows 的集合。我怎样才能防止这种情况发生?
这有点与从函数返回值时使用的“逗号技巧”相反,或者看起来是这样。
我可以从“TableData”列中删除 DataType 限制,但这只会导致未添加默认的空 DataTables,并且嵌套 datatble 作为 DataRows 的集合添加
Title TableData
----- ---------
Orange
Red
Blue System.Data.DataRow System.Data.DataRow
我真的很想能够使用 DataTables 的一些功能,但我也需要嵌套。如果不是,我需要重新考虑/重构很多。 DataColumn.DataType 上的文档没有提到这些复杂类型,但那部分代码最初似乎可以正常工作。
我做错了吗?或者这根本不可能?
附:这需要在 Powershell v3.0 / .Net 4.5 中工作
【问题讨论】:
-
$somedt = (New-Object System.Data.DataTable).PSObject.BaseObject -
@PetSerAl 就是这样!谢谢!。您能否将其放在答案中,以便我可以将其标记为这样?我现在正在阅读这个 baseobject 属性,但已经过测试,它可以按预期工作。非常感谢!
标签: .net powershell datatable