2014-03-26 43 views
1

在我的代碼中的許多地方,我使用StringBuilder構建SQL語句,並且在任何情況下,這都會觸發代碼分析中的CA2100: Review SQL queries for security vulnerabilities,因爲SQLCommand內容來自StringBuilder而不是文字。如何使用構造的查詢來避免CA2100

通常這些查詢是通過某些流控制(case或if)組裝的,其中查詢的各個部分可能是有條件的。

我的問題是,我應該抑制這些中的每一個,還是有不同的模式來構建(有時是複雜的)內聯查詢,但避免了警告?

觸發此代碼的一個例子:

System.Text.StringBuilder sb = new System.Text.StringBuilder(); 

sb.AppendLine("select "); 
sb.AppendLine(" Q.QUOTE_TITLE as [@Description] "); 
sb.AppendLine("from "); 
sb.AppendLine(" QUOTE Q "); 
sb.AppendLine("where "); 
sb.AppendLine(" Q.QUOTE_ID = @QUOTE_ID "); 
sb.AppendLine(" and Q.QUOTE_VERS = @QUOTE_VERS "); 
sb.AppendLine("for xml path('Contract') "); 

SqlCommand sqlCmd = new SqlCommand(sb.ToString(), MainDBConnection); 
sqlCmd.Parameters.Add("@QUOTE_ID", SqlDbType.Int).Value = QuoteID; 
sqlCmd.Parameters.Add("@QUOTE_VERS", SqlDbType.SmallInt).Value = QuoteVersion; 
+0

在上面的例子中,你可以使用單個字符串litersal構造整個查詢。在更復雜的情況下(例如where子句的內容取決於某些參數),您可以使用'String.Format'來替代一些魔法 – J0HN

回答

3

爲什麼你使用StringBuilder呢?你可以使用一個字符串,它也是更易讀的:

string sql = @"select Q.QUOTE_TITLE as [@Description] 
       from QUOTE Q 
       where Q.QUOTE_ID = @QUOTE_ID 
       and Q.QUOTE_VERS = @QUOTE_VERS 
       for xml path('Contract')"; 
SqlCommand sqlCmd = new SqlCommand(sql, MainDBConnection); 
sqlCmd.Parameters.Add("@QUOTE_ID", SqlDbType.Int).Value = QuoteID; 
sqlCmd.Parameters.Add("@QUOTE_VERS", SqlDbType.SmallInt).Value = QuoteVersion;