将带双引号和单引号的字符串从 EF 保存到 SQL

问题描述 投票:0回答:2

问题的焦点是

string text
格式,其他一切都只是为了上下文。如果重要的话,实际字符串大约有 10 页长。

string text = @"
    "" My string ''stringy'' with lots of ''quoties'' "" said Jimmy ''The Jimminator'' Smith.
";

API.Models.Table seedTable = new API.Models.Table()
{
    Created = new DateTimeOffset(DateTime.Now),
    TableText = text
};

db.Table.AddOrUpdate(seedTable);
db.SaveChanges();

这是将带有单引号和双引号的字符串从 EF 保存到 SQL 的正确方法吗?如果不是,正确的方法是什么?

db
只是我们的 dbContext。

编辑:问题中可能不清楚这一点。我担心的是,当我在 SQL Server 中发出查询或从 C# 执行 SQL 命令时,如果不将它们加倍,就无法输入带有单引号的字符串。然而,我的问题是 EF 是否足够智能来保存带有单引号的字符串,或者需要将它们加倍。

c# sql entity-framework
2个回答
7
投票

从 .NET 到 SQL 是 EF 需要担心的问题。哪些字符是特殊字符以及如何转义它们的规则因数据库而异,但在每种情况下 EF 都有代码来处理这些问题。

所以你根本不需要担心

'
在 SQL 中是特殊的。

因此,您需要担心的是如何在 .NET 中编写有效的字符串。如果在字符串前使用

@
以获得逐字字符串文字,则所有字符均按原样处理,但
"
除外,会转义为
""

如果没有,则不允许使用换行符或引号,但可以使用以下转义来转义它们:

  1. \u
    后跟四个十六进制数字:具有该代码点的字符
  2. \U
    后跟八个十六进制数字:具有该代码点的字符。
  3. \x
    后跟一到四个十六进制数字:具有该代码点的字符。
  4. \a
    \u0007
    (铃)
  5. 相同
  6. \b
    \u0008
    (退格)
  7. 相同
  8. \f
    \u000C
    (换页)
  9. \n
    \u000A
    (换行)
  10. 相同
  11. \r
    \u000D
    (回车)
  12. 相同
  13. \t
    \u0009
    (选项卡)
  14. 相同
  15. \v
    \u000B
    (垂直制表符)
  16. \'
    \u0027
    (撇号)
  17. 相同
  18. \"
    \u0022
    (引号)
  19. 相同
  20. \\
    \u005C
    ()
  21. 相同
  22. \0
    \u0000
    (空字符)
  23. 相同

并非所有这些在字符串中都是必需的,因此您可以使用

'
代替
\'
但它们要么难以键入,难以区分(如何区分制表符和某些空格?),要么不允许在其他上下文(在字符文字中需要
\'
)。

你的例子:

string text = @"
    "" My string ''stringy'' with lots of ''quoties'' "" said Jimmy ''The Jimminator'' Smith.
";

等同于:

string text="\n    \" My string ''stringy'' with lots of ''quoties'' \" said Jimmy ''The Jimminator'' Smith.\n";

或者也许是:

string text="\n\t\" My string ''stringy'' with lots of ''quoties'' \" said Jimmy ''The Jimminator'' Smith.\n";

因为 SO 的标记不清楚您是否想要在第一个换行符之后使用空格或制表符。

其中任何一个都是完全相同的,但是如果您有

''
的原因是为了转义 SQL,那么您不应该,将其留给 EF 来担心。有了这个,你是否有:

string text = @"
    "" My string 'stringy' with lots of 'quoties' "" said Jimmy 'The Jimminator' Smith.
";

或者:

string text="\n    \" My string 'stringy' with lots of 'quoties' \" said Jimmy 'The Jimminator' Smith.\n";

纯粹是你觉得更容易编写和阅读的问题。

一般来说,我建议您在大多数情况下使用后一种形式,但在文本中存在大量新行或存在大量

@ 的情况下,请使用逐字 (
\
) 形式
字符(例如正则表达式和 Windows 文件路径)。


3
投票

不必担心 SQL 语法是使用 EF 或任何 ORM 的主要好处之一。如果你有一个字符串:

string myString = "Don't worry about single quotes";

当您使用 EF 将该字符串存储到数据库时,它将像“不要担心单引号”一样进入。

其他语法也不重要(即 <>、% 等)

© www.soinside.com 2019 - 2024. All rights reserved.