首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C#中转义引号的神秘问题

C#中转义引号的神秘问题
EN

Stack Overflow用户
提问于 2009-12-02 06:41:12
回答 5查看 258关注 0票数 0

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

代码语言:javascript
复制
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;

我的问题是我得到的字符串看起来类似于:

"Select * From MeasurementsData Where Time = \"2009:11:11 11:11:11\“和Visit_ID...”

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

代码语言:javascript
复制
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);

这些期望的结果是在有或没有前面的@符号的情况下产生的。我摆弄了一阵子。

添加额外的反斜杠会转义反斜杠而不是引号(我认为应该这样),并且不会转义引号,因此无法编译。

删除反斜杠处理会导致引号无法转义,并且再次无法编译(正如我所预期的)。

但这才是真正让我着迷的地方。我尝试在代码中添加以下内容来删除反斜杠:

代码语言:javascript
复制
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;

而且它不会对字符串做任何操作!它仍然包含反斜杠。我需要一个比我更有经验的人来告诉我我做错了什么,或者如何避免这种行为。

再次感谢你的帮助。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2009-12-02 06:45:54

你应该这样做:

代码语言:javascript
复制
queryCommand.CommandText = "Select * From MeasurementsData " + 
                           "Where Time =@Time AND Visit_ID =@VisitId;";
queryCommand.Parameters.AddWithValue("@Time", time);
queryCommand.Parameters.AddWithValue("@VisitId", visit_id);

通过这种方式,您不需要添加这些引号,并且它可以安全地抵御SQL注入攻击。

票数 14
EN

Stack Overflow用户

发布于 2009-12-02 06:46:52

为什么不使用单引号呢?

代码语言:javascript
复制
string s = "Select * From MeasurementsData Where Time='" + time + "' AND Visit_ID='" + visit_id + "';";
票数 2
EN

Stack Overflow用户

发布于 2009-12-02 06:47:27

当使用'@‘符号时,没有“转义斜杠”。使用'@‘符号,你可以在字面上写出所有的字符,而不会有任何转义,除了引号字符“应该写两次才能视为一个字符”。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1829459

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档