You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 08:00:40