You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PowerShell将DB2 DataTable结果转为适配jQuery DataTables的JSON文件

根因定位
  1. 结构不匹配:序列化时未按jQuery DataTables的要求嵌套data父节点,直接输出了纯行数组。
  2. 序列化异常来源:
    • 集合内混装了DataTable整体对象、无结构的空行,非强类型集合触发了PowerShell序列化的隐式类型转换
    • 未指定ConvertTo-Json的序列化深度,默认深度为2时,超出层级的对象会被直接转为字符串形式的@{...}哈希表表示,也就是看到的错误输出
    • 原查询返回逻辑未逐行展开DataTable,直接传整个表对象进入管道,属性筛选未作用到行级别
      原实现存在过度设计:无需把DataTable、空行作为独立对象堆入ArrayList,统一存储行级纯对象即可满足需求。
修正实现代码

调整DB2查询函数

逐行返回排除冗余属性的纯对象,不输出整体DataTable:

Function Get-DB2Results { 
    param ($db2)
    $script:dbcmd.CommandText = $db2
    $rdr = $script:dbcmd.ExecuteReader()
    $dt = [System.Data.DataTable]::New()
    $dt.Load($rdr)
    # 逐行筛选属性,避免传入整体DataTable对象
    foreach ($row in $dt.Rows) {
        $row | Select-Object * -ExcludeProperty ItemArray, Table, RowError, RowState, HasErrors
    }
    $rdr.Close()
}

定义统一结构的空行

确保空行和数据行的列结构完全一致,不使用无结构的空值:

$blankLine = [PSCustomObject]@{
    A = ""
    B = ""
    C = ""
    D = ""
}

导出流程优化

用强类型列表存储行对象,嵌套data节点,指定足够的序列化深度:

Connect-DB2
# 用强类型PSObject列表替代ArrayList,避免混装类型异常
$allRows = [System.Collections.Generic.List[PSObject]]::New()
foreach ($query in $SQLArray) { 
    # 批量添加当前查询返回的所有行
    $allRows.AddRange([PSObject[]](Get-DB2Results -db2 $query))
    # 插入结构一致的空行
    $allRows.Add($blankLine)
}
Disconnect-DB2
# 按DataTables要求结构嵌套,指定10层序列化深度避免截断
@{
    data = $allRows.ToArray()
} | ConvertTo-Json -Depth 10 | Out-File \\SRV01\Data\totalsArray.txt -Force
修正后效果
  • 输出JSON结构完全匹配jQuery DataTables要求的顶层data数组格式,组件可直接读取渲染
  • 不会出现@{...}形式的字符串序列化错误,所有条目均为标准JSON对象
  • 无冗余的DataTable属性被序列化进输出文件

内容的提问来源于stack exchange,提问作者Mike W

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.25 23:54:03