2009-05-28 29 views
6

我得到這個參數:Powershell和SQL參數。如果空字符串,傳遞的DBNull

$objDbCmd.Parameters.Add("@telephone", [System.Data.SqlDbType]::VarChar, 18) | Out-Null; 
$objDbCmd.Parameters["@telephone"].Value = $objUser.Telephone; 

凡串$objUser.Telephone可以爲空。如果它是空的,我如何將它轉換爲[DBNull]::Value

我想:

if ([string]:IsNullOrEmpty($objUser.Telephone)) { $objUser.Telephone = [DBNull]::Value }; 

但是,這給我的錯誤:

Exception calling "ExecuteNonQuery" with "0" argument(s): "Failed to convert parameter value from a ResultPropertyValueCollection to a String."

如果我把它轉換成字符串,它插入一個空字符串"",而不是DBNull

這是如何實現的?

謝謝。

回答

15

在PowerShell中,你可以把空/空字符串作爲一個布爾值。

$x = $null 
if ($x) { 'this wont print' } 

$x = "" 
if ($x) { 'this wont print' } 

$x = "blah" 
if ($x) { 'this will' } 

所以....話說回來,你可以這樣做:

$Parameter.Value = $(if ($x) { $x } else { [DBNull]::Value }) 

但我寧願在這樣一個功能包裝這件事:

function CatchNull([String]$x) { 
    if ($x) { $x } else { [DBNull]::Value } 
} 
+0

非常有趣。謝謝喬希。我會在今天晚些時候進行測試,然後我會告訴你是否解決了我的問題。 – 2009-05-29 08:10:01

6

我不知道PowerShell的,但在C#我會做這樣的事情:

if ([string]::IsNullOrEmpty($objUser.Telephone)) 
{ 
$objDbCmd.Parameters["@telephone"].Value = [DBNull]::Value; 
} 
else 
{ 
$objDbCmd.Parameters["@telephone"].Value = $objUser.Telephone; 
} 
+0

在PowerShell中可以工作(只需稍作調整 - 編輯爲使用PowerShell語法調用靜態成員)。這是我在幾個腳本中完成的,並且它可以正常工作。 – 2009-05-28 16:36:59

+0

這將是一個解決方案是的。但我希望有一個「簡單」的解決方案,不需要太多的代碼。就像將空字符串轉換爲DBNull的函數一樣。我有60個參數... – 2009-05-28 19:19:02

1

始終追加+ 「」在db值的末尾...

$ command.Parameters [「@ EmployeeType」]。Value = $ ADResult.EmployeeType +「」

相關問題