From 47aece756f670dd80cf3d62be918f62a9ececf85 Mon Sep 17 00:00:00 2001
From: yeg <1347747024@qq.com>
Date: 星期三, 30 九月 2026 14:56:49 +0800
Subject: [PATCH] 更新

---
 scripts/j22-collector.ps1 |   29 +++++++++++++++++++++++++++--
 1 files changed, 27 insertions(+), 2 deletions(-)

diff --git a/scripts/j22-collector.ps1 b/scripts/j22-collector.ps1
index 9ddc921..daa3d5e 100644
--- a/scripts/j22-collector.ps1
+++ b/scripts/j22-collector.ps1
@@ -73,6 +73,24 @@
     Write-Host $line
 }
 
+# ---------------------------------------------------------------- 取值转换
+# 厂商列可能为 NULL:直接强转 [double]/[int] 会抛异常、让整个通道从此不再推进。
+# 缺列一律转成 JSON null,后端把测量列的缺失当"设备没给",不写零代替缺失。
+function To-Text($value) {
+    if ($null -eq $value -or $value -is [System.DBNull]) { return $null }
+    return [string]$value
+}
+
+function To-Int($value) {
+    if ($null -eq $value -or $value -is [System.DBNull]) { return $null }
+    return [int]$value
+}
+
+function To-Num($value) {
+    if ($null -eq $value -or $value -is [System.DBNull]) { return $null }
+    return [double]$value
+}
+
 # ---------------------------------------------------------------- 读取位置
 # 读取位置按「库里哪张表」记:"DB_<...>/Ws<N>_IV_0" -> 端点已确认的最后一条 record_time(FILETIME 刻度)
 function Get-ReadPositions {
@@ -105,7 +123,9 @@
             [void]$reader.GetValues($values)
             [void]$rows.Add($values)
         }
-        return $rows
+        # 必须用逗号包一层返回:函数返回集合时 PowerShell 会拆一层,只有一行结果时
+        # 调用方 foreach 拿到的就不是"行"而是那一行的列值本身,$row[0] 会变成字符串首字符。
+        return ,$rows
     }
     finally { $reader.Close() }
 }
@@ -215,7 +235,8 @@
     $tablesSeen = 0
     $emptyChannels = 0
 
-    foreach ($database in (Find-ActiveDatabases $connection)) {
+    $databases = Find-ActiveDatabases $connection
+    foreach ($database in $databases) {
         foreach ($table in (Find-ChannelTables $connection $database)) {
             if ($table -notmatch '^Ws(\d+)_IV_0$') { continue }
             $channel = [int]$Matches[1]
@@ -286,6 +307,10 @@
     Save-ReadPositions $positions
     Write-Log ("  本轮扫过 {0} 张通道表 / {1} 个通道;其中 {2} 个通道没有新行,推送 {3} 行" -f `
         $tablesSeen, $seenChannels.Count, $emptyChannels, $sentRows)
+    if ($tablesSeen -eq 0) {
+        # 一张都没扫到通常是库列表不对(而不是这些库真的空):把库名念出来,便于现场判断
+        Write-Log ("  提示:这些库里都没有 Ws*_IV_0 表 —— " + (($databases | Select-Object -First 8) -join ', '))
+    }
     return $sentRows
 }
 

--
Gitblit v1.7.1