如何在PowerShell中获取PostgreSQL表指定条件的行数并赋值给变量
解决PowerShell查询PostgreSQL行数无法获取结果的问题
你的代码存在两个核心问题:
SELECT COUNT(*)返回的列无明确命名,$dt.Column1的引用方式不准确(不同驱动返回的默认列名可能不同)- 未正确提取DataTable中唯一行的数值
修复方案1:给统计列加别名并提取行值
修改SQL语句为统计列指定别名,确保能精准引用:
$DBCmd = $DBConn.CreateCommand() # 为COUNT(*)指定别名row_count $DBCmd.CommandText = "SELECT COUNT(*) AS row_count FROM $Load_table_path WHERE audit_trail = '$MyAudit_trail'" $rdr = $DBCmd.ExecuteReader() $dt = [System.Data.DataTable]::new() $dt.Load($rdr) # 提取结果集中第一行的row_count列值 $testtt = $dt.Rows[0]["row_count"] # 验证结果 $testtt
修复方案2:使用参数化查询(避免SQL注入风险)
直接拼接变量到SQL语句存在安全隐患,建议改用参数化查询:
$DBCmd = $DBConn.CreateCommand() $DBCmd.CommandText = "SELECT COUNT(*) AS row_count FROM $Load_table_path WHERE audit_trail = @AuditTrail" # 创建并添加参数 $param = $DBCmd.CreateParameter() $param.ParameterName = "@AuditTrail" $param.Value = $MyAudit_trail $DBCmd.Parameters.Add($param) $rdr = $DBCmd.ExecuteReader() $dt = [System.Data.DataTable]::new() $dt.Load($rdr) $testtt = $dt.Rows[0]["row_count"] $testtt
额外优化:用ExecuteScalar简化代码
如果仅需获取单个统计值,ExecuteScalar() 比DataReader+DataTable更简洁高效:
$DBCmd = $DBConn.CreateCommand() $DBCmd.CommandText = "SELECT COUNT(*) FROM $Load_table_path WHERE audit_trail = @AuditTrail" $param = $DBCmd.CreateParameter() $param.ParameterName = "@AuditTrail" $param.Value = $MyAudit_trail $DBCmd.Parameters.Add($param) # ExecuteScalar直接返回结果集第一行第一列的数值 $testtt = $DBCmd.ExecuteScalar() $testtt
内容的提问来源于stack exchange,提问作者Locupus
相关产品推荐
相关产品推荐

