2009-07-10 24 views
5

Quale codice dovrei aggiungere per accettare null dall'istruzione WHERE.After ExecuteScalar: Riferimento oggetto non impostato ecc.

{ 
    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

ti invitiamo a dare un titolo migliore per la vostra domanda? Questo è molto generico. –

+0

Mi dispiace Alex, farò meglio il verbage la prossima volta. – Yves

risposta

12

Just:

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

Ma io non sono affatto convinto che è ciò che si vuole veramente, o la causa del problema.

Se stai ricevendo un'eccezione nel codice C#, non lo sarà dalla clausola where.

Sono preoccupato dal fatto che la connessione sembra riutilizzare una variabile esistente, tra l'altro. Cattiva idea. Dovrebbe quasi certamente essere una variabile locale. È inoltre possibile rendere il codice più semplice, di ritorno dal centro di essa:

string sql = ...; 

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

Se il problema è come dice Jamie, che ExecuteScalar sta tornando nullo, il modo più facile di ottenere rotonda che è quello di gettare in un annullabile int e utilizzare l'operatore null coalescente:

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

sqlexception: incoreect syntax vicino a 'nullgroup'. "DOVE Tipo A (2, 3, 4, 5, 6, 8, 13, 14, 16, 22) o il tipo NULL" + "GROUP BY MgtApproval" + – Yves

+0

non hai messo uno spazio dopo "NULL ". –

+0

Ad esempio, dovresti avere "... IS NULL" + "GROUP BY ..." (o usare letteralmente una stringa letterale per semplificare) –

2

Il problema è probabilmente il cast diretto per int. Ciò genera un'eccezione se cmd.ExecuteScalar() restituisce null. Devi decidere cosa restituire in quel caso. Per questo esempio sto tornando 0 se cmd.ExecuteScalar() restituisce 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 perché non vengono restituite righe a causa della clausola HAVING. Tuttavia, la tua idea è corretta ma potrebbe comunque non avere la clausola WHERE e non restituire comunque righe – gbn

1

Per inciso, è molto più facile/più chiaro per formattare stringhe multilinea:

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"; 
Problemi correlati