Я пытаюсь вставить DataTable в сценарий Powershell. Рассмотрим очень простой DataTable:Вложенные данные Powershell DataTable
$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
Я хотел бы, чтобы это как значение в другом DataTable. Итак, давайте создадим один:
$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, как это " Значение таблицыДата:
$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. Как я могу предотвратить это?
Это своего рода обратная сторона «запятой», используемой при возврате значений из функции или, как кажется.
я могу снять ограничение DataType из столбца «TableData», но это как раз и приводит к дефолту пустых DataTables не добавили и вложенная datatble добавляются в коллекции DataRows
Title TableData
----- ---------
Orange
Red
Blue System.Data.DataRow System.Data.DataRow
Я бы очень хотел, чтобы быть способный использовать некоторые функции DataTables, но мне также нужна вложенность. Если нет, мне нужно немного переосмыслить/рефакторировать. В документации по DataColumn.DataType не упоминаются эти сложные типы, но эта часть кода, похоже, работает нормально.
Я что-то не так? или это просто невозможно?
P.s. это должно работать в Powershell v3.0/.Net 4,5
'$ somedt = (New-Object System.Data.DataTable) .PSObject.BaseObject' – PetSerAl
@PetSerAl Вот и все! Благодаря!. Не могли бы вы ответить на него, чтобы я мог отметить это как таковое? Я читаю об этом свойстве baseobject прямо сейчас, но уже протестирован и работает так, как ожидалось. Большое спасибо! – mvdwrd