我甚至不知道从哪里开始解决这个问题。我正在尝试做一些非常简单的事情,创建一个带引号的字符串。我对此没有任何问题(即使在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 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;
它对字符串没有任何作用!它仍然包含反斜杠。我需要有比我更多经验的人向我展示我做错了什么或如何解决这种行为。
再次感谢您的帮助。
答案 0 :(得分:14)
你应该选择:
queryCommand.CommandText = "Select * From MeasurementsData " +
"Where Time =@Time AND Visit_ID =@VisitId;";
queryCommand.Parameters.AddWithValue("@Time", time);
queryCommand.Parameters.AddWithValue("@VisitId", visit_id);
这样您就不需要放置这些引号,而且可以安全地防止SQL注入攻击。
答案 1 :(得分:2)
为什么不使用单引号?
string s = "Select * From MeasurementsData Where Time='" + time + "' AND Visit_ID='" + visit_id + "';";
答案 2 :(得分:2)
使用'@'符号时,没有“逃避斜杠”。 使用'@'符号你可以在没有任何转义的情况下逐字编写所有字符,除了引号char“应该被写两次以作为一个。
答案 3 :(得分:2)
@"\"blah\""
将生成\"blah\"
。 @"""blah"""
将生成"blah"
。
答案 4 :(得分:2)
这是因为你正在查看调试器中的字符串,调试器正在逃避它。
如果你添加这一行:
Console.WriteLine(s);
你会发现字符串实际上是正确的!
Select * From MeasurementsData Where Time ="2009:12:01 12:00:00" AND Visit_ID ="10012";
(我同意其他人的意见,你不应该通过构建字符串来创建SQL,而是使用查询参数将数据发送到数据库)。