繁体   English   中英

用C#引号引起的神秘麻烦

[英]Mysterious trouble with escaping quotes in C#

我什至不知道从哪里开始这个问题。 我正在尝试做一些非常简单的事情,创建一个带引号的字符串。 我对此没有任何问题(即使在C#中也是如此),但是这一特定的代码块表现得很奇怪(至少以我的专业知识)。

Match timeExtractor = (new Regex(@"'(?<time>\d{4}:\d{2}:\d{2} \d{1,2}:\d{2}:\d{2})'")).Match(SQLstatement);
string time = timeExtractor.Groups["time"].ToString();
Match visitIDExtractor = (new Regex(@"VALUES\('(?<visit_id>[\d]+)'")).Match(SQLstatement);
string visit_id = visitIDExtractor.Groups["visit_id"].ToString();
string s = "Select * From MeasurementsData Where Time =\"" + time + "\" AND Visit_ID =\"" + visit_id + "\";";
queryCommand.CommandText = s;

我的问题是我得到的字符串看起来像以下内容:

“选择*从MeasurementsData,其中时间= \\“ 2009:11:11 11:11:11 \\” AND Visit_ID ....”

在表达式中出现反斜杠。 在另一个应用程序中运行的以下测试代码产生了我想要的结果(没有反斜杠的结果)

string time = @"2009:11:11 11:11:11";
string visit_id = @"1279";
string s = "Select * From MeasurementsData Where Time =\"" + time + "\" AND Visit_ID =\"" + visit_id + "\";";
Console.WriteLine(s);

使用或不使用前面的@符号都会产生这些期望的结果。 我摆弄了一段时间。

添加一个额外的反斜杠会转义反斜杠,而不是引号(正如我认为的那样),并且不会转义引号,因此不会编译。

删除反斜杠对待导致引号不能被转义,并且它将再次无法编译(正如我预期的那样)。

但这才真正让我受益。 我尝试仅使用以下代码添加来删除反斜杠:

Match timeExtractor = (new Regex(@"'(?<time>\d{4}:\d{2}:\d{2} \d{1,2}:\d{2}:\d{2})'")).Match(SQLstatement);
string time = timeExtractor.Groups["time"].ToString();
Match visitIDExtractor = (new Regex(@"VALUES\('(?<visit_id>[\d]+)'")).Match(SQLstatement);
string visit_id = visitIDExtractor.Groups["visit_id"].ToString();
string s = "Select * From MeasurementsData Where Time =\"" + time + "\" AND Visit_ID =\"" + visit_id + "\";";
s = s.Replace("\\", "");
queryCommand.CommandText = s;

它对字符串没有任何作用! 它仍然包含反斜杠。 我需要比我有更多经验的人来告诉我我在做错什么或如何解决此问题。

再次感谢您的帮助。

您应该选择:

queryCommand.CommandText = "Select * From MeasurementsData " + 
                           "Where Time =@Time AND Visit_ID =@VisitId;";
queryCommand.Parameters.AddWithValue("@Time", time);
queryCommand.Parameters.AddWithValue("@VisitId", visit_id);

这样,您就不需要加上引号,并且可以安全地防止SQL注入攻击。

为什么不使用单引号呢?

string s = "Select * From MeasurementsData Where Time='" + time + "' AND Visit_ID='" + visit_id + "';";

使用“ @”符号时,没有“转义斜线”。 使用'@'符号,您可以按字面意义写所有字符,没有任何转义,只是引号char“应该写两次才能视为一个。

@"\\"blah\\""将产生\\"blah\\" @"""blah"""将产生"blah"

这是因为您正在调试器中查看字符串,而调试器正在转义该字符串。

如果添加此行:

Console.WriteLine(s);

您会看到字符串实际上是正确的!

Select * From MeasurementsData Where Time ="2009:12:01 12:00:00" AND Visit_ID ="10012";

(我也同意其他观点,您不应通过构建字符串来创建SQL,而应使用查询参数将数据发送到数据库)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM