转义逐字字符串文字
我有以下不会编译的字符串:
String formLookupPull = @"SELECT value1, '"+tableName+"', '"+columnName+"' FROM lkpLookups WHERE ""table"" = '" + tableName + "' and ""field"" = '" + columnName + "';";
违规部分是:
""table"" =
和
""field"" =
编译器在转义序列上混淆了一切。 任何人都可以看到什么是错的?
问题是,并非所有串联的字符串都是逐字字符串文字,只有连接的第一部分是。
换一种说法,
@"SELECT value1, '"
是构建最终字符串的整个语句中唯一的逐字文字。
您需要在其余字符串前面添加@以使它们全部逐字。
这将使它看起来像:
String formLookupPull = @"SELECT value1, '"+tableName+ @"', '"+columnName+ @"' FROM lkpLookups WHERE ""table"" = '" + tableName + @"' and ""field"" = '" + columnName + @"';";
解决你的标题问题……
要在逐字字符串文字中转义引号,请使用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)
你想用\"
来逃避引号,而不是""
。
像这样:
.. 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.";
在你的第一个引用结束后,@符号不再被使用,所以你可以自由使用转义字符。 尝试将你的“表格”包裹在'[‘像[table]和[field]中,或者用“\”转义“字符”。
String formLookupPull = @"SELECT value1, '" + tableName + "', '" + columnName + "' FROM lkpLookups WHERE [table] = '" + tableName + "' and [field] = '" + columnName + "';";
如果你不能使用SQL参数,String.Format可以比纯粹的“+连接”更清晰和可读。
string formLookupPull = string.Format(@"SELECT value1, '{0}', '{1}' FROM lkpLookups WHERE ""table"" = '{0}' AND ""field"" = '{1}';", tableName, columnName);
String formLookupPull = @"SELECT value1, '"+tableName+"', '"+columnName+"' FROM lkpLookups WHERE \"table\" = '" + tableName + "' and \"field\" = '" + columnName + "';";
我也相信你在构建这个查询之前正确地转义这些变量:)
你为什么引用列的文字名称,对我来说似乎没用。
“SELECT value1,”+ tableName +“,”+ columnName +“FROM lkpLookups WHERE table =’”+ tableName +“’and field =’”= columnName +“’;”;
没有经过测试,但我认为你会得到这个想法。