2012-07-19 151 views
2

我确信之前已经询问过这个问题,但在这里或Internet上找不到任何东西。我试图使用PowerShell来查询一个Oracle数据库,它似乎没有问题,直到它达到一个空值,然后它爆炸。在PowerShell中处理空值

这是我的代码。

# 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 " 
} 

错误消息:

异常调用 “的GetString” 与 “1” 的参数(一个或多个): “列包含 NULL数据” 在C:\用户\ klynch \ test.ps1:34炭:27 + $ DNP = $ reader.GetString < < < <(16) + CategoryInfo:NotSpecified:(:) [],MethodInvocationException + FullyQualifiedErrorId:DotNetMethodException

+0

“然后它炸毁” - 你能让我们有错误信息吗? – Ollie 2012-07-19 15:45:49

+0

上面添加了错误消息。 – Ken 2012-07-19 15:51:27

回答

1

我会摆脱“SELECT *”并明确指定您的字段。然后你可以使用NVL/COALESCE将你的NULL值转换成你可以处理的东西。它更容易打字,但它记录了你正在选择的内容,并且可以帮助你在表格结构改变时避免错误。

SELECT *

是不好的做法,海事组织,任何东西,但即席类型查询。

+0

你是对的选择*是不好的做法。我正在将Java项目转换为PowerShell,因此我只复制并粘贴了他们使用的查询。谢谢,我会做一些调整,看看会发生什么。 – Ken 2012-07-19 15:48:45

+0

好的NVL非常适合那些始终为空的列,但它不适用于只有少数空值的列,并且coalesce似乎会跳过空值的记录,这对我无能为力。 – Ken 2012-07-19 16:24:45

+0

你是什么意思“没有工作”? – DCookie 2012-07-19 16:28:15

1

可以检查当前行具有给定列与

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

这是我需要感谢的最后一件作品。 – Ken 2012-07-19 18:10:44

0

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