2012-03-10 100 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