2012-03-10 12 views
5

Ho una funzione che pensavo di aver corretto per CA2000 nell'analisi del codice, ma non andrà via. L'avviso è su SqlCommand. Ecco la funzione:Analisi codice C# CA

protected internal void LogUserSession(int? managerID) 
{ 
    using (var sqlCommand = new SqlCommand()) 
    { 
     sqlCommand.SetCommand("usp_UserActivity_Create"); 

     SqlParameter prmSessionID = new SqlParameter(); 
     prmSessionID.ParameterName = "@sessionID"; 
     prmSessionID.Direction = ParameterDirection.Input; 
     prmSessionID.SqlDbType = SqlDbType.VarChar; 
     prmSessionID.Size = 32; 
     prmSessionID.SetValue(SessionID); 

     SqlParameter prmUsername = new SqlParameter(); 
     prmUsername.ParameterName = "@username"; 
     prmUsername.Direction = ParameterDirection.Input; 
     prmUsername.SqlDbType = SqlDbType.VarChar; 
     prmUsername.Size = 32; 
     prmUsername.SetValue(Username); 

     SqlParameter prmLoginID = new SqlParameter(); 
     prmLoginID.ParameterName = "@loginID"; 
     prmLoginID.Direction = ParameterDirection.Output; 
     prmLoginID.SqlDbType = SqlDbType.Int; 

     sqlCommand.Parameters.Add(prmSessionID); 
     sqlCommand.Parameters.Add(prmUsername); 
     sqlCommand.Parameters.Add(prmLoginID); 

     using (sqlCommand.Connection = new SqlConnection(ConnectionStrings.MainApp)) 
     { 
      sqlCommand.Connection.Open(); 
      sqlCommand.ExecuteNonQueryTryCatch(); 

      if (prmLoginID.Value != DBNull.Value) LoginID = Convert.ToInt32(prmLoginID.Value); 
     } 
    } 
} 

ho un'altra funzione che mi sembra non è diverso, ma non dispone di un avvertimento CA2000 associato ad esso. Ecco quella funzione:

public static bool IsAvailable(string username) 
     { 
      using (var sqlCommand = new SqlCommand()) 
      { 
       sqlCommand.SetCommand("usp_UsernameIsAvailable"); 

       var prmUsername = new SqlParameter(); 
       prmUsername.ParameterName = "@username"; 
       prmUsername.Direction = ParameterDirection.Input; 
       prmUsername.SqlDbType = SqlDbType.VarChar; 
       prmUsername.Size = 32; 
       prmUsername.SetValue(username); 

       var prmReturnValue = new SqlParameter(); 
       prmReturnValue.ParameterName = "@returnValue"; 
       prmReturnValue.Direction = ParameterDirection.ReturnValue; 
       prmReturnValue.SqlDbType = SqlDbType.Bit; 

       sqlCommand.Parameters.Add(prmUsername); 
       sqlCommand.Parameters.Add(prmReturnValue); 

       using (sqlCommand.Connection = new SqlConnection(ConnectionStrings.ComplianceApps)) 
       { 
        sqlCommand.Connection.Open(); 
        sqlCommand.ExecuteNonQueryTryCatch(); 

        return Convert.ToBoolean(prmReturnValue.Value); 
       } 
      } 
     } 

Non capisco cosa sta succedendo qui e cosa devo fare per risolverlo.

+0

Qual è SessionID, per curiosità? È solo una proprietà stringa della classe da cui proviene questo metodo? –

+0

Non ricevo un avviso per il codice con l'analisi del codice 'Microsoft All Rules'. – Phil

+0

SessionID è l'ID generato dalla sessione che l'utente apre quando colpisce l'applicazione. È un riferimento alla sessione effettiva dell'utente. – Chris

risposta

3

L'avviso CA2000 è noto per causare falsi positivi. Una delle cose che fa è quando trova più di 16 possibili posizioni che possono generare un'eccezione, semplicemente smette di cercare e contrassegna l'avviso della CA.

Una domanda molto simile con una risposta da Microsoft può essere trovato qui: http://social.msdn.microsoft.com/Forums/en-US/vstscode/thread/90f993a3-6bdf-4b62-9982-9247a655406d/

Collegare bug tracking questo problema: https://connect.microsoft.com/VisualStudio/feedback/details/725836/warning-ca2000-is-fired-on-a-sqlcommand-with-many-sqlparameters#details