【问题标题】:How to preserve null values in string interpolation C#如何在字符串插值C#中保留空值
【发布时间】:2019-11-07 16:34:29
【问题描述】:

我想保留空值(将它们插入数据库),同时将它们作为字符串传递给我的 C# 代码中的 sql 变量。

var valString = new StringBuilder();
//somevalue is null at this point
valString.Append($"({id}, " +$"'{SomeValue}')");

字符串插值返回 SomeValue => '' 的空字符串,而不是 null。 我想在字符串插值中保留该空值并将其传递给查询字符串。 有可能吗?

【问题讨论】:

  • 我强烈建议您开始使用参数化 SQL,而不是完全以字符串格式传递值。这样做的最大优势是防止 SQL 注入攻击。
  • 这看起来很适合 SQL 注入。您应该从不使用字符串插值构造 SQL 语句。每个库中都有用于进行参数插值的工具,您应该使用这些工具。
  • @SumnerEvans:有时使用字符串插值构造 SQL 是合适的,例如对于可变数量的列。它对有风险的 values 使用字符串插值。 (还有一些奇怪的方法可以使用 FormattableString 安全地完成这些操作,但这是另一回事。)
  • 确定此要求的人是否知道他们正在打开一个重大安全漏洞?我强烈敦促您反对这一点。请注意,即使您确实想要这样做,您也不会想要'NULL',而是想要NULL。使用普通的条件运算符或if 语句而不是试图将行为塞进字符串插值本身是最简单的。
  • @VahRun:您正在构建字符串。这就是整个问题。字符串不包含引用等 - 它们只是文本。这正是我们一直建议您避免的,通过使用参数化 SQL。

标签: c# asp.net asp.net-mvc string-interpolation


【解决方案1】:

如果它不为空,这将使用 SomeValue,如果是,则使用 NULL。

var valString = new StringBuilder();
//somevalue is null at this point
valString.Append($"({id}," + (SomeValue == null ? "NULL" : $"'{SomeValue}'"));

【讨论】:

  • 但是否可以将该 Null 保留为 null 对象而不是将其设置为字符串?
  • 没有。 SQL 的 Null 被翻译为 DBNull.Value,而不是 C# 的 null。不同的对象。
  • @VahRun 不使用字符串连接。就是这样。没有要保留的空值,当输入值为空时,您要求生成 NULL 字符串(四个字符)。只是不要这样做。由于本地化问题,您很容易遇到错误的 SQL、SQL 注入攻击或无效文本。
  • 我同意,尽管这可能是一种不好的做法,而且这样做很危险。还有其他更安全的查询选项。
【解决方案2】:

你可以这样做:

var valString = new StringBuilder();
valString.Append($"({id}, " +$"'{SomeValue ?? "null"}')");

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-06-24
    • 2013-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-17
    相关资源
    最近更新 更多