【问题标题】:Handling nulls in powershell在 powershell 中处理空值
【发布时间】:2021-06-25 18:51:38
【问题描述】:

我确定以前有人问过这个问题,但我在这里或互联网上找不到任何东西。我正在尝试使用 powershell 查询一个似乎可以正常运行的 oracle 数据库,直到它达到空值然后它就崩溃了。

这是我的代码。

# Create a datareader for a SQL statement 
$sql="select * from legacydb.ebt_invoice_dtl where premnum = 397743"
$command = New-Object Oracle.DataAccess.Client.OracleCommand( $sql,$conn)
$reader=$command.ExecuteReader()

# Write out the result set structure 
for ($i=0;$i -lt $reader.FieldCount;$i++) {
Write-Host  $reader.GetName($i) $reader.GetDataTypeName($i) 
}

# Write out the results 
while ($reader.read()) {
$dtl_id=$reader.GetDecimal(0)  
$invoice_id=$reader.GetDecimal(1)
$debtor=$reader.GetInt64(2)
$premise=$reader.GetInt64(3)
$license=$reader.GetString(4)
$invoice_num=$reader.GetInt64(5)
$deb_cred=$reader.GetString(6)
$inv_ref=$reader.GetString(7)
$rate=$reader.GetDecimal(8)
$charge=$reader.GetDouble(9)
$usage=$reader.GetInt64(10)
$tax=$reader.GetDouble(11)
$rate_code=$reader.GetString(12)
$inv_date=$reader.GetDateTime(13)
$missed=$reader.GetString(14)
$change_date=$reader.GetDateTime(15)
$dnp=$reader.GetString(16)

Write-Host "$dtl_id $invoice_id $debtor $premise $license $invoice_num $deb_cred        $inv_ref $rate $charge $usage $tax $rate_code $inv_date $missed $change_date $dnp "
}

错误信息:

使用“1”参数调用“GetString”的异常:“列包含 NULL 数据”在 C:\users\klynch\test.ps1:34 char:27 + $dnp=$reader.GetString

【问题讨论】:

  • “然后它就爆炸了” - 你能告诉我们错误信息吗?

标签: oracle powershell


【解决方案1】:

我会摆脱“SELECT *”并明确命名您的字段。然后你可以使用 NVL/COALESCE 将你的 NULL 值转换成你可以处理的东西。它需要更多的预先输入,但它会记录您选择的内容,并且如果表结构发生变化,可能会帮助您避免以后出现错误。

选择 *

IMO 对除了临时类型查询以外的任何事情都是不好的做法。

【讨论】:

  • 你说得对 Select * 是不好的做法。我正在将一个 java 项目转换为 powershell,所以我只是复制并粘贴了他们使用的查询。谢谢,我会做一些调整,看看会发生什么。
  • 好的 NVL 对于总是为空的列工作得很好,但它不适用于只有几个空值的列,并且合并似乎跳过了对我没有帮助的空值记录。
  • 使用“1”参数调用“GetInt64”的异常:“指定的转换无效。”在 C:\users\klynch\test.ps1:23 char:34 + $invoice_num=$reader.GetInt64
  • 你在使用NVL的时候,将null值转换成什么?
【解决方案2】:

您可以检查当前行对于给定列是否为空

if ($reader.IsDBNUll(column)) {
  # Handle null
} else {
  # Get the value
}

【讨论】:

    【解决方案3】:

    另一种解决方案是使用reader.GetOracleValue 方法,该方法将返回Oracle Data Provider 对象之一。这些对象可以存储 null 值,因此每个对象都有一个 IsNull 属性来检查 null 和一个 Value 属性,可能还有转换方法,例如ToInt32,获取普通 .NET 类型的值。

    【讨论】:

      【解决方案4】:

      我认为解决此问题的最佳方法是使用:GetOracleDecimal()GetOracleString()。 在这种情况下,null 将显示为一个值,您不会有任何 null 错误。

      【讨论】:

        猜你喜欢
        • 2014-05-31
        • 2012-12-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-01-15
        • 2016-07-18
        • 1970-01-01
        相关资源
        最近更新 更多