Избежание дословных строковых литералов - PullRequest
7 голосов
/ 17 марта 2009

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

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

Оскорбительные разделы:

""table"" =

и

""field"" = 

Компилятор запутался в escape-последовательности. Кто-нибудь может увидеть, что не так?

Ответы [ 7 ]

17 голосов
/ 17 марта 2009

Чтобы ответить на ваш заглавный вопрос ...

Чтобы экранировать кавычку в буквальном строковом литерале, используйте кавычку-escape-последовательность "" (это два символа кавычки)

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)
6 голосов
/ 17 марта 2009

Проблема в том, что не все строки, которые вы объединяете, являются дословно строковыми литералами, только первая часть объединения является.

Другими словами,

@"SELECT value1, '"

является единственным дословным литералом во всем операторе для построения окончательной строки.

Вам потребуется добавить @ перед остальными строками, чтобы сделать их все дословно.

Что бы выглядело так:

String formLookupPull = @"SELECT value1, '"+tableName+ @"', '"+columnName+ @"' FROM lkpLookups WHERE ""table"" = '" + tableName + @"' and ""field"" = '" + columnName + @"';";
5 голосов
/ 17 марта 2009

Вы хотите использовать \" для экранирования кавычек, а не "".

Как это:

.. 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.";
4 голосов
/ 17 марта 2009

Если вы не можете использовать параметры SQL, String.Format может быть немного чище и удобочитаемее, чем «+ конкатенация».

string formLookupPull = 
  string.Format(@"SELECT value1, '{0}', '{1}' 
                       FROM lkpLookups 
                   WHERE ""table"" = '{0}' AND ""field"" = '{1}';",
                tableName, columnName);
4 голосов
/ 17 марта 2009

Через некоторое время после первого конца цитаты символ @ больше не используется, поэтому вы можете свободно использовать escape-символ. Попробуйте поместить «таблицу» в «[» как [таблица] и [поле] или экранировать символ «\».

String formLookupPull = @"SELECT value1, '" + tableName + "', '" + columnName + "' FROM lkpLookups WHERE [table] = '" + tableName + "' and [field] = '" + columnName + "';";
1 голос
/ 17 марта 2009

Почему вы цитируете буквальные названия столбцов, мне кажется ненужными.

"SELECT value1," + tableName + "," + columnName + "ИЗ lkpLookups WHERE

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

1 голос
/ 17 марта 2009
String formLookupPull = @"SELECT value1, '"+tableName+"', '"+columnName+"' FROM lkpLookups WHERE \"table\" = '" + tableName + "' and \"field\" = '" + columnName + "';";

Я также верю, что перед построением этого запроса вы правильно экранировали эти переменные:)

...