2012-07-19 150 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類型的值。