2009-05-28 13 views
6

Tengo este parámetro:Powershell y parámetros de SQL. Si cadena vacía, pase DBNull

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

Cuando la cadena $objUser.Telephone puede estar vacío. Si está vacío, ¿cómo puedo convertirlo a [DBNull]::Value?

me trataron:

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

Pero eso me da el error:

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

Y si me convierto en una cadena, se inserta una cadena vacía "", y no DBNull.

¿Cómo se puede lograr esto?

Gracias.

Respuesta

15

En PowerShell, puede tratar a cadenas nulas/vacíos como un valor lógico.

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

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

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

Así que .... una vez dicho esto se puede hacer:

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

Pero yo preferiría terminar con esto de una función como:

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

Muy interesante. Gracias Josh. Lo probaré más tarde hoy y luego te avisaré si resolvió mi problema. –

6

No sé acerca de PowerShell, pero en C# Me gustaría hacer algo como esto:

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

Eso sí funciona en PowerShell (con un pequeño ajuste - editado para llamar a un miembro estático usando la sintaxis de PowerShell). Eso es lo que hice en varios guiones y funciona correctamente. –

+0

Esa sería una solución sí. Pero esperaba una solución "más simple" que no requiera tanto código. Como una función que convierte una cadena vacía en DBNull. Tengo como 60 parámetros ... –

1

Siempre añadir + "" al final de los valores db ...

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

Cuestiones relacionadas