在C# ASP.NET中如何结合条件判断操作String.Format?
嘿,我来帮你解决这个SQL拼接的问题!不过首先得敲个警钟:直接用String.Format拼接SQL字符串是非常危险的行为,很容易遭遇SQL注入攻击,这可是生产环境里的大隐患。所以我先给你两种方案,优先推荐安全的参数化查询方案,另一种是兼容现有写法的动态拼接(但真心不建议用)。
方案一:安全的参数化查询(强烈推荐)
这种方式不仅能灵活处理条件的动态添加,还能彻底避免SQL注入风险,是行业标准做法:
public void GetProjectInfo(string projectname, string Iteration) { // 用StringBuilder构建基础SQL,方便动态追加条件 var sqlBuilder = new StringBuilder(@" SELECT [System.Id], [System.Title], [Story.Author], [Story.Owner], [System.AssignedTo], [System.WorkItemType], [Microsoft.VSTS.Scheduling.StoryPoints] FROM [Source] WHERE [Source].[System.ProjectName] = @ProjectName"); // 准备参数集合,先添加必填的projectname参数 var sqlParameters = new List<SqlParameter> { new SqlParameter("@ProjectName", SqlDbType.NVarChar) { Value = projectname } }; // 处理Iteration参数:不为空/空字符串时,追加条件和对应参数 if (!string.IsNullOrEmpty(Iteration)) { sqlBuilder.Append(" AND [Source].[System.IterationPath] IN (@Iteration)"); sqlParameters.Add(new SqlParameter("@Iteration", SqlDbType.NVarChar) { Value = Iteration }); // 如果你的Iteration是逗号分隔的多个值,这里需要额外处理(比如拆分成多个参数或用表值参数) // 举个多值处理的例子: // string[] iterations = Iteration.Split(','); // var paramNames = new List<string>(); // for (int i = 0; i < iterations.Length; i++) // { // string paramName = $"@Iteration{i}"; // paramNames.Add(paramName); // sqlParameters.Add(new SqlParameter(paramName, SqlDbType.NVarChar) { Value = iterations[i].Trim() }); // } // sqlBuilder.Append($" AND [Source].[System.IterationPath] IN ({string.Join(", ", paramNames)})"); } // 执行SQL的示例代码(记得替换成你的数据库连接字符串) using (var connection = new SqlConnection("Your_Connection_String_Here")) { connection.Open(); using (var command = new SqlCommand(sqlBuilder.ToString(), connection)) { command.Parameters.AddRange(sqlParameters.ToArray()); // 读取查询结果,比如用SqlDataReader using (var reader = command.ExecuteReader()) { // 这里写处理查询结果的逻辑 while (reader.Read()) { // 示例:读取字段值 int workItemId = reader.GetInt32(reader.GetOrdinal("[System.Id]")); string title = reader.GetString(reader.GetOrdinal("[System.Title]")); // ... 其他字段处理 } } } } }
方案二:动态拼接字符串(仅作兼容参考,不推荐)
如果你只是临时需要调整现有代码,不想改参数化逻辑,可以用这种方式,但一定要注意SQL注入和单引号转义的问题:
public void GetProjectInfo(string projectname, string Iteration) { // 基础SQL模板(注意:这里直接拼接projectname有注入风险,最好还是转义单引号) string baseQuery = @" SELECT [System.Id], [System.Title], [Story.Author], [Story.Owner], [System.AssignedTo], [System.WorkItemType], [Microsoft.VSTS.Scheduling.StoryPoints] FROM [Source] WHERE [Source].[System.ProjectName] = '{0}'"; string querystring; // 处理Iteration参数 if (!string.IsNullOrEmpty(Iteration)) { // 追加Iteration条件的模板 baseQuery += " AND [Source].[System.IterationPath] IN ('{1}')"; // 转义单引号防止SQL语法错误和注入(但这只是临时措施,不如参数化安全) string safeProjectName = projectname.Replace("'", "''"); string safeIteration = Iteration.Replace("'", "''"); querystring = string.Format(baseQuery, safeProjectName, safeIteration); } else { string safeProjectName = projectname.Replace("'", "''"); querystring = string.Format(baseQuery, safeProjectName); } // 后续执行querystring的代码(这里省略,同样建议换成参数化执行) }
再次强调:方案二只是临时妥协,生产环境一定要用参数化查询,不然很容易被黑客利用SQL注入攻击窃取或破坏数据。
内容的提问来源于stack exchange,提问作者user9470599
相关产品推荐
相关产品推荐

