我甚至不知道从哪里开始解决这个问题。我正在尝试做一些非常简单的事情,创建一个带引号的字符串。我对此没有问题(即使在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;我的问题是我得到的字符串看起来类似于:
"Select * From MeasurementsData Where Time = \"2009:11:11 11:11:11\“和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;而且它不会对字符串做任何操作!它仍然包含反斜杠。我需要一个比我更有经验的人来告诉我我做错了什么,或者如何避免这种行为。
再次感谢你的帮助。
发布于 2009-12-02 06:45:54
你应该这样做:
queryCommand.CommandText = "Select * From MeasurementsData " +
"Where Time =@Time AND Visit_ID =@VisitId;";
queryCommand.Parameters.AddWithValue("@Time", time);
queryCommand.Parameters.AddWithValue("@VisitId", visit_id);通过这种方式,您不需要添加这些引号,并且它可以安全地抵御SQL注入攻击。
发布于 2009-12-02 06:46:52
为什么不使用单引号呢?
string s = "Select * From MeasurementsData Where Time='" + time + "' AND Visit_ID='" + visit_id + "';";发布于 2009-12-02 06:47:27
当使用'@‘符号时,没有“转义斜杠”。使用'@‘符号,你可以在字面上写出所有的字符,而不会有任何转义,除了引号字符“应该写两次才能视为一个字符”。
https://stackoverflow.com/questions/1829459
复制相似问题