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