Экранирование дословных строковых литералов
у меня есть следующая строка, которая не будет компилироваться:
String formLookupPull = @"SELECT value1, '"+tableName+"', '"+columnName+"' FROM lkpLookups WHERE ""table"" = '" + tableName + "' and ""field"" = '" + columnName + "';";
оскорбительные разделы:
""table"" =
и
""field"" =
компилятор все путается в escape-последовательности. Кто-нибудь видит, что случилось?
7 ответов
проблема в том, что не все строки объединении являются дословно строковые литералы, только первая часть конкатенация.
другими словами,
@"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 для получения более подробной информации на выходе и т. д.
обратите внимание, что в вашем опубликованном коде единственная строка дословного текста - самая первая (с @
до нее). Последующие строки не являются дословными, поэтому правильная escape-последовательность будет \"
.
вы можете сделать его выглядеть красивее с string.Format
:
String formLookupPull =
string.Format(@"SELECT value1, '{0}', '{1}' FROM lkpLookups" +
@"WHERE ""table"" = '{0}' and ""field"" = '{1}';",
tableName, columnName)
вы хотите использовать \"
чтобы избежать кавычек, а не ""
.
такой:
.. FROM lkpLookups WHERE \"table\" = '" ..
Edit:
дальнейших объяснений:
у вас есть только @
на первой из всех строк, которые вы объединяете. В литеральных строках (с @
спереди) вы избегаете кавычек с двойной кавычкой. В обычных строках это Слэш-цитата.
например.
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.";
Ну после первого конца цитаты символ @ больше не используется, поэтому вы можете использовать escape-символ. Попробуйте поместить свою "таблицу", завернутую в " [ ", как [таблица] и [поле] или избегая " символа с \.
String formLookupPull = @"SELECT value1, '" + tableName + "', '" + columnName + "' FROM lkpLookups WHERE [table] = '" + tableName + "' and [field] = '" + columnName + "';";
Если вы не можете использовать параметры SQL, String.Формат может быть немного чище и читабельнее, чем чистая "+ конкатенация".
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 + "';";
Я также верю, что вы правильно экранируете эти переменные перед построением этого запроса:)
Почему вы цитируете буквальные имена столбцов, кажутся мне ненужными.
"выберите value1," + tableName +", "+ columnName + "из lkpLookups, где table = '"+ tableName + "'и field = '" = columnName+"';";
не проверено, но я думаю, что вы получите идею.