Я хотел сделать свой запрос 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
...,
...,
...);
Вы пробовали SqlParameter? https://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlparameter(v=vs.110).aspx – buffjape
@buffjape Я собирался использовать его для значения '{3}' позже , Могу ли я также использовать его для вставки имени таблицы? Я никогда не пытался вставлять что-либо еще. Я предполагаю, что это единственное использование, которое я когда-либо видел ... Я попробую, и мы увидим через мгновение ;-) – t3chb0t
Вам не нужны цитаты, если вы используете параметризованный запрос. Просто добавьте параметр и укажите тип столбца в БД. – Gnqz