2009-05-28 17 views
6

Bu parametreyi aldım:Powershell ve SQL parametreleri. Boş bir dize varsa, DBNull iletin

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

$objUser.Telephone dizesi boş olabilir. Boşsa, [DBNull]::Value'e nasıl dönüştürebilirim?

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

Ancak bu bana hatayı veriyor:

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

Ve eğer onu bir dizgeye dönüştürürsem, "" boş bir dize "" ekler.

Bu nasıl başarılabilir?

Teşekkürler.

cevap

15

PowerShell'de, boolean olarak null/boş dizeler tedavi edebilir. + Her zaman

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

Çok ilginç. Sağol Josh. Bunu daha sonra bugün test edeceğim ve sonra sorunumu çözüp çözmediğimi size bildireceğim. –

6

Ben powershell bilmem ama C# böyle bir şey yapacağını:

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

Bu, PowerShell'de çalışır (bir küçük tweak ile - PowerShell sözdizimini kullanarak statik bir üyeyi çağırmak üzere düzenlenmiştir). Çeşitli senaryolarda yaptım ve düzgün çalışıyor. –

+0

Bu bir çözüm olurdu evet. Ama bu kadar kod gerektirmeyen “daha ​​basit” bir çözüm olmasını umuyordum. Boş bir dize DBNull'a dönüştüren bir işlev gibi. 60 parametre gibi aldım ... –

1

ekleyin:

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

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

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

Yani .... yapabileceğiniz söyledikten:

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

Ama ben daha ziyade gibi bir fonksiyonu içinde suç mahali vardı db değerlerinin sonunda "" ...

$ command.Parameters ["@ EmployeeType"]. = Value = $ ADResult.EmployeeType + ""