2012-03-10 103 views
5

我有一個功能,我認爲我已經修復了代碼分析中的CA2000警告,但它不會消失。警告在SqlCommand上。這裏的功能:C#代碼分析CA2000

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); 
     } 
    } 
} 

我有另一個功能,對我來說看起來沒有什麼不同,但沒有與它關聯的CA2000警告。這裏的功能:

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); 
       } 
      } 
     } 

我不明白這裏發生了什麼,我需要做什麼來解決它。

+0

什麼是SessionID的,出於好奇?這只是該方法來自類的字符串屬性嗎? – 2012-03-10 23:21:36

+0

我沒有收到代碼分析「Microsoft All Rules」的代碼警告。 – Phil 2012-03-10 23:50:00

+0

SessionID是從用戶打到應用程序時打開的會話生成的ID。它是對用戶實際會話的參考。 – Chris 2012-03-11 00:07:44

回答

3

CA2000警告因誤報造成臭名昭着。它所做的一件事是,當它發現超過16個可能引發異常的位置時,它會停止查看並標記CA警告。

與微軟的響應非常類似的問題可以在這裏找到: http://social.msdn.microsoft.com/Forums/en-US/vstscode/thread/90f993a3-6bdf-4b62-9982-9247a655406d/

連接bug跟蹤這一問題: https://connect.microsoft.com/VisualStudio/feedback/details/725836/warning-ca2000-is-fired-on-a-sqlcommand-with-many-sqlparameters#details