Recibí el error anterior en mi aplicación. Aquí está el código original
public string GetCustomerNumber(Guid id)
{
string accountNumber =
(string)DBSqlHelperFactory.ExecuteScalar(connectionStringSplendidmyApp,
CommandType.StoredProcedure,
"GetCustomerNumber",
new SqlParameter("@id", id));
return accountNumber.ToString();
}
Reemplacé con
public string GetCustomerNumber(Guid id)
{
object accountNumber =
(object)DBSqlHelperFactory.ExecuteScalar(connectionStringSplendidCRM,
CommandType.StoredProcedure,
"spx_GetCustomerNumber",
new SqlParameter("@id", id));
if (accountNumber is System.DBNull)
{
return string.Empty;
}
else
{
return accountNumber.ToString();
}
}
¿Hay una mejor forma de evitar esto?
Respuestas:
Se puede utilizar una forma más corta:
EDITAR: No he prestado atención a ExecuteScalar. Realmente devuelve nulo si el campo está ausente en el resultado devuelto. Entonces usa en su lugar:
fuente
null
, si la fila seleccionada tieneNULL
en esa columna, el valor de retorno esSystem.DBNull
.Con una función genérica simple puede hacer esto muy fácil. Solo haz esto:
usando la función:
fuente
ExecuteScalar volverá
Si sabe que la primera columna del conjunto de resultados es una cadena, entonces, para cubrir todas las bases, debe verificar tanto el valor nulo como el DBNull. Algo como:
El código anterior se basa en el hecho de que DBNull.ToString devuelve una cadena vacía.
Si accountNumber fuera de otro tipo (digamos entero), entonces tendría que ser más explícito:
Si sabe con certeza que su conjunto de resultados siempre tendrá al menos una fila (por ejemplo, SELECT COUNT (*) ...), puede omitir la comprobación de nulo.
En su caso, el mensaje de error "No se puede convertir un objeto de tipo 'System.DBNull' en el tipo 'System.String`" indica que la primera columna de su conjunto de resultados es un valor DBNUll. Esto es del elenco a la cadena en la primera línea:
El comentario de Marc_s de que no es necesario verificar DBNull.Value es incorrecto.
fuente
Puede utilizar el operador de fusión nula de C #
fuente
Hay otra forma de solucionar este problema. ¿Qué tal modificar el procedimiento de su tienda? al usar ISNULL (su campo, "") función sql, puede devolver una cadena vacía si el valor de retorno es nulo.
Entonces tienes tu código limpio como versión original.
fuente
Este es el método genérico que utilizo para convertir cualquier objeto que pueda ser un DBNull.Value:
uso:
corta:
fuente
Supongo que puedes hacerlo así:
Si accountNumber es nulo, significa que era DBNull, no una cadena :)
fuente
return (accountNumber as string) ?? string.Empty;
, con accountNumber aún siendo unobject
. Si prefiere mantener su base de datos, llame a su propia línea.String.Concat transforma DBNull y valores nulos en una cadena vacía.
Sin embargo, creo que pierde algo en la comprensibilidad del código
fuente
return "" + accountNumber;
?Desde que obtuve una instancia que no es nula y si comparé con DBNULL obtuve
Operator '==' cannot be applied to operands of type 'string' and 'system.dbnull'
excepción, y si intenté cambiar para comparar con NULL, simplemente no funcionó (ya que DBNull es un objeto) incluso esa es la respuesta aceptada.Decidí usar simplemente la palabra clave 'es'. Entonces el resultado es muy legible:
data = (item is DBNull) ? String.Empty : item
fuente
Utilizo una extensión para eliminar este problema, que puede ser o no lo que buscas.
Dice así:
Nota:
¡Esta extensión no devuelve
null
valores! Si el artículo esnull
o DBNull.Value , devolverá una cadena vacía.Uso:
fuente
Convertirlo como
fuente