2016-01-20 2 views
1

Я хотел сделать свой запрос sql bullet proof и нашел this вопрос о санитарных названиях таблиц/столбцов.Почему моя команда sql не принимает цитируемый идентификатор имени таблицы?

Я следовал советам, но как-то он не работает должным образом.

Мое имя таблицы foo.Bar поэтому я передал его QuoteIdentifier метода CommandBuilder «s, и он дал мне [foo.Bar] спину.

Когда я звоню (string)cmd.ExecuteScalar();, он жалуется, что эта таблица не существует. Поэтому я попытался изначально определить имя таблицы как [foo].[Bar]. В этом случае QuoteIdentifier создает [[foo]].[Bar]]], который также не работает.

Единственное, что работает, это когда я указываю только [foo].[Bar] без использования метода QuoteIdentifier.

На данный момент мне интересно, могу ли я использовать его вообще для защиты моих запросов? Это не очень полезно, и настройка цитируемого запроса, например, another answer, также не кажется правильным.

Я могу что-то сделать, чтобы защитить запрос и заставить его работать и принять имя [foo].[Bar], не нарушая его?

Это, как я создаю запрос:

cmd.CommandText = string.Format(
    "SELECT {0} FROM {1} WHERE {2} = '{3}'{4}", 
    ..., 
    sanitizedTableName, // only [foo].[Bar] works -- [[foo]].[Bar]]] and [foo.Bar] fail 
    ..., 
    ..., 
    ...); 
+1

Вы пробовали SqlParameter? https://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlparameter(v=vs.110).aspx – buffjape

+0

@buffjape Я собирался использовать его для значения '{3}' позже , Могу ли я также использовать его для вставки имени таблицы? Я никогда не пытался вставлять что-либо еще. Я предполагаю, что это единственное использование, которое я когда-либо видел ... Я попробую, и мы увидим через мгновение ;-) – t3chb0t

+0

Вам не нужны цитаты, если вы используете параметризованный запрос. Просто добавьте параметр и укажите тип столбца в БД. – Gnqz

ответ

2

Проблема заключается в том, что имя таблицы bar, не foo.bar. Вы используете идентификатор с несколькими частями - foo - это схема, а bar - имя таблицы.

Чтобы получить правильное цитирование, вам нужно процитировать каждый идентификатор отдельно:

QuoteIdentifier(schemaName) + "." + QuoteIdentifier(tableName) 

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

+0

Имеет смысл для меня, и теперь это работает ;-) – t3chb0t

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