转义纯文本字符串字面量

7

我有一个编译不通过的字符串:

String formLookupPull = @"SELECT value1, '"+tableName+"', '"+columnName+"' FROM lkpLookups WHERE ""table"" = '" + tableName + "' and ""field"" = '" + columnName + "';";

冒犯的部分如下:
""table"" =

and

""field"" = 

编译器在转义序列上出现混乱。有人能看出问题在哪里吗?

感谢您的快速回复! - Brian Sweeney
7个回答

17

回答您的标题问题...

要在一个verbatim字符串文本中转义引号,请使用引号转义序列""(即两个引号字符)。

string a = @"He said ""Hi!""..."; // He said "Hi!"...

参见MSDN获取有关转义等更多详细信息。

请注意,在您的发布代码中,唯一的逐字字符串是第一个字符串(@之前的字符串)。后续字符串不是逐字字符串,因此正确的转义序列应为\"

您可以使用 string.Format 使其更漂亮:

String formLookupPull = 
   string.Format(@"SELECT value1, '{0}', '{1}' FROM lkpLookups" +
                 @"WHERE ""table"" = '{0}' and ""field"" = '{1}';", 
                 tableName, columnName)

6
问题在于你连接的字符串并非全部都是 原样 字符串字面量,只有连接中的第一个部分是。
换句话说,
@"SELECT value1, '"

这是整个语句中唯一的逐字文本,用于构建最终字符串。

您需要在其余字符串前面添加@以使它们全部成为逐字文本。

这将使其看起来像:

String formLookupPull = @"SELECT value1, '"+tableName+ @"', '"+columnName+ @"' FROM lkpLookups WHERE ""table"" = '" + tableName + @"' and ""field"" = '" + columnName + @"';";

4
你需要使用\"来转义引号,而不是""
像这样:
.. FROM lkpLookups WHERE \"table\" = '" ..

编辑:

进一步解释:

你只在连接的第一个字符串前加了一个@。在文字字符串(前面有@)中,你用双引号转义引号。在普通字符串中,是斜杠引号。

例如:

string s = @"this is a literal string with ""quotes"" in it, " 
         +  "and this is a normal string with \"quotes\" in it";

string t = @"two literal strings" + @", concatenated together.";

逐字字符串文字不使用\作为转义字符,唯一的转义序列是"",这就是正在使用的。问题在于,逐字字符串标识符@仅应用于第一个字符串,而不是通过+附加的字符串。 - Whatsit
问题在于他对字符串类型使用了错误的转义序列。他可以将字符串更改为字面值(正如你所说的那样),或更改转义序列(正如我所说的那样)。 - Blorgbeard
同意,但你最初的回答暗示“”在一般意义上是不正确的,所以可能会让对逐字字符串不太熟悉的人感到困惑。你修订后的答案更清晰了。 - Whatsit

4

在第一个引号结束后,@符号不再使用,所以您可以自由地使用转义字符。尝试使用方括号将您的“table”包装起来,例如[table]和[field],或者用\转义双引号。

String formLookupPull = @"SELECT value1, '" + tableName + "', '" + columnName + "' FROM lkpLookups WHERE [table] = '" + tableName + "' and [field] = '" + columnName + "';";

4
如果您无法使用SQL参数,String.Format可以比纯粹的“+连接”更加清晰易读。
string formLookupPull = 
  string.Format(@"SELECT value1, '{0}', '{1}' 
                       FROM lkpLookups 
                   WHERE ""table"" = '{0}' AND ""field"" = '{1}';",
                tableName, columnName);

这可能是这样一种情况...我正在使用一个未向我公开任何相关信息的库,尽可能地坚持使用它,因为它会带来一些副作用,否则我需要重新制造... - Brian Sweeney

1
String formLookupPull = @"SELECT value1, '"+tableName+"', '"+columnName+"' FROM lkpLookups WHERE \"table\" = '" + tableName + "' and \"field\" = '" + columnName + "';";

我也相信在构建此查询之前,您已经正确地转义了这些变量 :)


哈哈,是啊,希望如此。我被给了一个包含所有执行数据库 IO 功能的 DLL。我相信它会进行适当的 SQL 转义,但我没有仔细查看。 - Brian Sweeney

1

你为什么要引用列的字面名称,这对我来说似乎是不必要的。

"SELECT value1, " + tableName + "," + columnName +" FROM lkpLookups WHERE table = '" + tableName + "' and field = '" = columnName + "';";

尚未测试,但我认为你会明白这个想法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接