2011-10-28 21 views
9

Estoy intentando agregar una columna a un DataRow existente en C#. Después, la columna se completará con un único valor de mi base de datos.ExecuteScalar devuelve nulo o DBNull (servidor de desarrollo o producción)

DataRow dr ya existe y la columna "COLNAME" también existe.
comTBP es mi SqlCommand.

dr["COLNAME"] = Convert.ToInt32(comTBP.ExecuteScalar()); 

Todo esto funciona bien si hay un valor en mi base de datos y ExecuteScalar() puede obtener ese valor. Si pruebo este código en mi servidor de desarrollo (local) también funciona si ExecuteScalar() devuelve nulo o DBNull y el valor de mi nueva columna es 0. Pero el problema aparece si despliegue mi código en el servidor de producción. Si hago todo lo mismo, con la misma base de datos lanza una excepción con un mensaje que no puede convertir DBNull a Int32.
Mi pregunta es por qué aparece este error en el servidor de producción y no en mi servidor de desarrollo local?

+1

de datos Lo más probable diferentes sobre la producción y el desarrollo. – leppie

Respuesta

7

Claramente en producción, tiene un NULL devuelto desde la ejecución del comando o algo diferente en la conexión de línea o lo que sea; como regla general, siempre debe probar DBNull antes de convertir/convertir directamente a otro tipo el resultado de ExecuteScalar. respuesta

de Check Rein aquí (y lo vote up) por su buena solución sugerida:

Unable to cast object of type 'System.DBNull' to type 'System.String`

+1

'Convert.ToInt32' de' null' da como resultado 0. –

+0

Entonces o él no dice la verdad o estás equivocado ;-) Tuve problemas similares en el pasado y los resolví siempre buscando DBNULL antes de convertir/casting –

+1

Sé que devuelve NULL en producción ... también devuelve NULL en desarrollo porque es la misma base de datos. Mi pregunta era ¿por qué devuelve NULL en desarrollo y ** DBNull ** en producción? En desarrollo, la conversión de NULL a Int32 dará como resultado 0 pero en producción intenta convertir DBNull a Int32 y arroja una excepción – Yoni

17

ExecuteScalarDBNull retornos de valor nulo de query y null para ningún resultado. Tal vez en su servidor de desarrollo nunca ocurrió (null resultado de query).

2

Utilice la función ISNULL() en su SQL.

ISNULL (check_expression, replacement_value)

es decir ...

SELECT ISNULL (SUM (Price), 0) desde el pedido

Cuestiones relacionadas