Экранирование дословных строковых литералов

у меня есть следующая строка, которая не будет компилироваться:

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+"';";

не проверено, но я думаю, что вы получите идею.