2009-07-10 18 views
5

Qué código debo agregar para aceptar nulo de la instrucción WHERE.Después de ExecuteScalar: Referencia de objeto no establecida, etc.

{ 
    int numApprovals = 0; 
    string sql = "SELECT COUNT(Type) AS OpenforApproval " + 
     "FROM dbo.LeaveRequest " + 
     "WHERE Type IN (2, 3, 4, 5, 6, 8, 13, 14, 16, 22) " + 
     "GROUP BY MgtApproval " + 
     "HAVING MgtApproval IS NULL"; 
     //"SELECT COUNT(EffectiveDate) AS OpenforApproval FROM LeaveRequest GROUP BY TimeStampApproval HAVING (TimeStampApproval IS NULL)"; 

    using (cn = new SqlConnection(ConnectionString())) 
    { 
     cn.Open(); 
     using (cmd = new SqlCommand(sql, cn)) 
     { 
      cmd.CommandType = CommandType.Text; 
      numApprovals = (int)cmd.ExecuteScalar(); 
     } 
    } 

    return numApprovals; 
} 
+0

¿Puede por favor dar un mejor título de su ¿pregunta? Esto es muy genérico –

+0

Lo siento Alex, haré mejor verbage la próxima vez. – Yves

Respuesta

12

Justo:

WHERE Type IN (2, 3, 4, 5, 6, 8, 13, 14, 16, 22) OR Type IS NULL 

Pero no estoy del todo convencido de que es lo que realmente quiere, o la causa del problema.

Si obtiene una excepción en el código C#, no va a ser de la cláusula where.

Me preocupa el hecho de que su conexión parece estar reutilizando una variable existente, por cierto. Mala idea. Casi seguramente debería ser una variable local. También puede hacer su código más simple mediante la devolución de la mitad de ella:

string sql = ...; 

using (var cn = new SqlConnection(ConnectionString())) 
{ 
    cn.Open(); 
    using (cmd = new SqlCommand(sql, cn)) 
    { 
     cmd.CommandType = CommandType.Text; 
     return (int) cmd.ExecuteScalar(); 
    } 
}  

Si el problema es como dice Jamie, que ExecuteScalar vuelve nula, la forma más fácil de conseguir redonda que es echarlo a un anulable int y utiliza el operador nulo coalescente:

return (int?) cmd.ExecuteScalar() ?? 0; 
+0

sqlexception: sintaxis incoreect cerca de 'nullgroup'. "WHERE Escriba IN (2, 3, 4, 5, 6, 8, 13, 14, 16, 22) O escriba IS NULL" + "GROUP BY MgtApproval" + – Yves

+0

No ha puesto espacio después de "NULL ". –

+0

es decir, debe tener "... IS NULL" + "GROUP BY ..." (o use literal literal de una cadena para hacer esto más fácil) –

2

El problema es probablemente el lanzamiento directo a int. Esto arroja una excepción si cmd.ExecuteScalar() devuelve nulo. Debe decidir qué devolver en ese caso. Para este ejemplo estoy regresando 0 si cmd.ExecuteScalar() devuelva null

using (cn = new SqlConnection(ConnectionString())) 
{ 
    cn.Open(); 
    using (cmd = new SqlCommand(sql, cn)) 
    { 
     cmd.CommandType = CommandType.Text; 
     object result = cmd.ExecuteScalar(); 
     numApprovals = result == null ? 0 : (int)result; 
    } 
} 

return numApprovals; 
+0

Solo porque no vuelven filas debido a la cláusula HAVING. Sin embargo, su idea es correcta, pero aún puede fallar la cláusula WHERE y no devolver filas de todos modos – gbn

1

Dicho sea de paso, es mucho más fácil/más clara para formatear multilínea:

string sql = 
@"SELECT COUNT(Type) AS OpenforApproval 
FROM dbo.LeaveRequest 
WHERE Type IN (2, 3, 4, 5, 6, 8, 13, 14, 16, 22) 
GROUP BY MgtApproval 
HAVING MgtApproval IS NULL"; 
Cuestiones relacionadas