2009-03-16 4 views
7

У меня есть следующая строка, которая не будет компилировать:Экранирование стенографических строковых литералов

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

Срезов обижая являются:

""table"" = 

и

""field"" = 

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

+0

спасибо за быстрые ответы! –

+1

Вы можете подумать о том, чтобы нанести удар по этой проблеме, используя LINQtoSQL вместо того, чтобы скомпилировать вашу собственную строку запроса. –

ответ

6

Проблема заключается в том, что не все строки вы конкатенация являются стенографические строковые литералы, только первая часть конкатенации.

Других слов,

@"SELECT value1, '" 

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

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

Что бы сделать его выглядеть следующим образом:

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

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

Как это:

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

Вербальные строковые литералы не используют \ в качестве escape-символа, единственная escape-последовательность - это "", что и используется. Проблема заключается в том, что стенографический идентификатор строки @ применяется только к первой строке, а не к тем, которые добавляются с +. – Whatsit

+0

Проблема в том, что он использует неправильную escape-последовательность для своего типа строки. Он может либо изменить строку на буквенный (как вы говорите), либо изменить escape-последовательность (как я уже сказал) – Blorgbeard

+0

Согласен, но ваш первоначальный ответ подразумевал, что «" был неправильным в общем смысле, поэтому он, вероятно, смутил бы кого-то, кто не слишком хорошо разбирается в строковых литералах. Ваш пересмотренный ответ намного яснее. – Whatsit

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

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

+0

lol да давайте надеяться, поэтому мне была предоставлена ​​DLL со всеми функциями для выполнения DB IO внутри нее ... Я почти уверен, что он делает правильный SQL-выход, но я действительно не смотрел внимательно ... –

4

Ну после первого конца цитаты, символ @ больше не используется в любом случае, так что вы бесплатно использовать escape-символ. Попробуйте поместить свой «стол», завернутый в «[», как [стол] и [поле] или спасаясь от "характера с \.

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

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

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

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) 
4

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

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

Редко, вы не можете использовать DbParameter в DbCommand. – ProfK

+0

Это может быть один такой случай ... Я использую библиотеку, которая не раскрывает мне ничего подобного, и я стараюсь придерживаться ее как можно больше, потому что она имеет несколько побочных эффектов, которые я 'd необходимо воспроизвести иначе ... –

+0

+1. 'String.Format' намного лучше для этого. –

1

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

"SELECT value1," + tableName + "," + columnName + "FROM lkpLookups WHERE table = '" + tableName + "' и field = '" = columnName + "';";

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

Смежные вопросы