问题的焦点是
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 是否足够智能来保存带有单引号的字符串,或者需要将它们加倍。
从 .NET 到 SQL 是 EF 需要担心的问题。哪些字符是特殊字符以及如何转义它们的规则因数据库而异,但在每种情况下 EF 都有代码来处理这些问题。
所以你根本不需要担心
'
在 SQL 中是特殊的。
因此,您需要担心的是如何在 .NET 中编写有效的字符串。如果在字符串前使用
@
以获得逐字字符串文字,则所有字符均按原样处理,但 "
除外,会转义为 ""
。
如果没有,则不允许使用换行符或引号,但可以使用以下转义来转义它们:
\u
后跟四个十六进制数字:具有该代码点的字符\U
后跟八个十六进制数字:具有该代码点的字符。\x
后跟一到四个十六进制数字:具有该代码点的字符。\a
与\u0007
(铃)\b
与 \u0008
(退格)\f
与 \u000C
(换页)\n
与 \u000A
(换行)\r
与 \u000D
(回车)\t
与 \u0009
(选项卡)\v
与 \u000B
(垂直制表符)\'
与 \u0027
(撇号)\"
与 \u0022
(引号)\\
与 \u005C
()\0
与 \u0000
(空字符)并非所有这些在字符串中都是必需的,因此您可以使用
'
代替 \'
但它们要么难以键入,难以区分(如何区分制表符和某些空格?),要么不允许在其他上下文(在字符文字中需要 \'
)。
你的例子:
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 文件路径)。
不必担心 SQL 语法是使用 EF 或任何 ORM 的主要好处之一。如果你有一个字符串:
string myString = "Don't worry about single quotes";
当您使用 EF 将该字符串存储到数据库时,它将像“不要担心单引号”一样进入。
其他语法也不重要(即 <>、% 等)