转义逐字字符串文字

时间:2009-03-16 22:04:49

标签: c# string escaping verbatim-string

我有以下不会编译的字符串:

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

违规部分是:

""table"" =

""field"" = 

编译器在转义序列上混淆了一切。任何人都可以看到什么是错的吗?

7 个答案:

答案 0 :(得分:17)

解决你的标题问题......

要在逐字字符串文字中转义引号,请使用quote-escape-sequence ""(这是两个引号字符)

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)

答案 1 :(得分:6)

问题在于,并非您连接的所有字符串都是 verbatim 字符串文字,只有连接的第一部分是。

换句话说,

@"SELECT value1, '"

是构建最终字符串的整个语句中唯一 verbatim 文字。

您需要在字符串的其余部分前面添加@才能将它们全部逐字地添加。

这会使它看起来像:

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

答案 2 :(得分:5)

您希望使用\"来转义引号,而不是""

像这样:

.. 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.";

答案 3 :(得分:4)

在你的第一个引用结束后,@符号不再被使用,所以你可以自由使用转义字符。尝试将“表格”包裹在'[',如[table]和[field]中,或者用“\”转义“字符”。

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

答案 4 :(得分:4)

如果你不能使用SQL参数,String.Format可以比纯粹的“+连接”更清晰和可读。

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

答案 5 :(得分:1)

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

我还相信你在构建这个查询之前正确地转义了这些变量:)

答案 6 :(得分:1)

为什么要引用列的文字名称,对我来说似乎没用。

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

未经测试,但我认为您会明白这一点。