c# - StringBuilder.Append 问题

标签 c# stringbuilder

谁能告诉我为什么下面的代码在字符串前后添加了 2 个单引号('' string '')?

    List<string> rolls
    StringBuilder sb = new StringBuilder();

            foreach (var roll in rolls)
                sb.Append("'" + roll + "',");

            string rollList = sb.ToString().TrimEnd(',');

    string sql =
               @"SELECT enrolment_status, roll_number FROM dt_modular_enrolment WHERE id_student = ?
                    AND roll_number in " + "( " + rollList + " )"; 

    creates the below:
    in ( ''ROLL4'',''ROLL6'',''ROLL5'',''ROLL1'',''ROLL2'',''ROLL3'' )

谢谢!

只是为了更新 - 代码没有任何问题(除了 sql 注入(inject)的可能性)它是一个添加额外引号的 sql 分析器错误。

最佳答案

从 SQL 注入(inject)的角度来看,这实际上是非常危险的。不幸的是,IN 查询很难正确地参数化,因为 TSQL 缺少“拆分”功能。但是,有很多工具可以帮助您做到这一点。例如,对于大多数 LINQ 提供程序,它只是:

List<string> rolls = ...
int studentId = ...
var query = from row in ctx.ModularEnrolment
            where row.StudentId = studentId
            and rolls.Contains(row.roll_number)
            select new { row.EnrolmentStatus, row.RollNumber };

或使用类似 dapper 的工具(当不使用括号时,它对 in @someParameter 有特殊处理):

List<string> rolls = ...
int studentId = ...
var rows = connection.Query(@"
SELECT enrolment_status, roll_number FROM dt_modular_enrolment
WHERE id_student = @studentId and roll_number in @rolls",
        new { rolls, studentId });

关于c# - StringBuilder.Append 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17669883/

相关文章:

java - 为什么在 StringBuilder 构造函数中使用连接比调用 append() 快 100 倍?

java - 用正则表达式中的路径递归替换正则表达式查找

c# - 如何获取当前属性的名称

c# - 添加两个可为空的整数不起作用

c# - 如何在没有 IEnumerable 的情况下循环该对象

c# - 交易范围和手动定义的交易之间的区别?

c# - 如果键不存在,C# Dictionary<int, int> 查找会发生什么情况?

java - 返回 StringBuilder 或 StringBuffer 的 StringUtils.replaceEach?

java - 如何获取用户输入(来自扫描仪)并将整个输入转换为 ascii

.net - "Don' t 在这个热代码路径中使用 StringBuilder 或 foreach”