在powershell中处理空值

时间:2012-07-19 15:32:28

标签: oracle powershell

我确定之前已经问过,但我在这里或互联网上找不到任何东西。我正在尝试使用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<<<< (16)       + CategoryInfo:NotSpecified:(:) [],MethodInvocationException       + FullyQualifiedErrorId:DotNetMethodException

4 个答案:

答案 0 :(得分:1)

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

  

SELECT *

对于除临时类型查询之外的任何事情,

都是不好的做法,IMO。

答案 1 :(得分:1)

您可以使用

检查当前行对于给定列是否为空
if ($reader.IsDBNUll(column)) {
  # Handle null
} else {
  # Get the value
}

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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