我甚至不知道从哪里开始这个问题.我正在尝试做一些非常简单的事情,创建一个带引号的字符串.我对此没有任何问题(即使在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;
Run Code Online (Sandbox Code Playgroud)
我的问题是我的结果字符串看起来像是:
"选择*来自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);
Run Code Online (Sandbox Code Playgroud)
使用或不使用前面的@符号产生这些期望的结果.我摆弄了一段时间.
添加额外的反斜杠会转义反斜杠而不是引号(我相信它应该)并且不会转义引号,因此它不会编译.
删除反斜杠处理导致报价不被转义,再一次它不会编译(如我所料).
但这才是我真正得到的.我尝试删除反斜杠,并添加以下代码:
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;
Run Code Online (Sandbox Code Playgroud)
它对字符串没有任何作用!它仍然包含反斜杠.我需要一个比我更有经验的人向我展示我做错了什么或如何绕过这种行为.
再次感谢您的帮助.
Rub*_*ias 14
你应该去:
queryCommand.CommandText = "Select * From MeasurementsData " +
"Where Time =@Time AND Visit_ID =@VisitId;";
queryCommand.Parameters.AddWithValue("@Time", time);
queryCommand.Parameters.AddWithValue("@VisitId", visit_id);
Run Code Online (Sandbox Code Playgroud)
这样您就不需要放置这些引号,并且可以安全地防止SQL注入攻击.