2015-11-09 2 views
0

Я разрабатываю программу базы данных C#, но теперь у меня возникают проблемы с использованием метода SelectTable regExpression DataTable.C# DataTable.cselect (string regExpression) - странное исключение throw

Я вызываю метод так: «Колонка [JonDoe] не был найден»

DataRow[] tmpDr = tblUser.Select("user_id=JonDoe"); 

Всегда, когда я пытаюсь сделать это, выберите метод генерирует исключение

Но мой понимание метода Select состояло в том, что в моем случае он выбирает все строки из tblUser, где user_id = JonDoe. Итак, user_id - это столбец и JonDoe - ценность, которую я ищу. Почему функция Select предполагает, что JonDoe будет столбцом в таблице?

Спасибо за все ваши ответы!

ответ

0

Точно так же, как user_id, JonDoe разобран как имя столбца.

Чтобы сделать строковый литерал, оберните его в кавычки.

+0

На самом деле, это код, который я использую в своей программе: DataRow [] tmpDr = tblUser.Select ("user_id =" + др [я] .ToString()); – Enemenemiste

1

Вы должны прочитать документацию DataTable.Expression. В частности:

Пользовательские значения могут использоваться в выражениях для сравнения со значениями столбцов. Значения строк должны быть заключены в одинарные кавычки (и каждый одиночный кавычек в строковом значении должен быть экранирован, добавив его другим символом кавычки).

Таким образом, в этом случае вы хотите:

DataRow[] tmpDr = tblUser.Select("user_id='JonDoe'"); 

Вы в настоящее время не указав значение в кавычки, так это рассматривается как ссылка на столбец - так же, как это было бы в SQL.

Очевидно, что подобный подход уязвим к тем же атакам инъекций, что и SQL ... но без смягчающей функции параметризованных запросов, насколько мне известно. Если вы хотите фильтровать значения, указанные пользователем, которые могут включать в себя кавычки и т. Д., Вам может быть лучше использовать LINQ, например.

var rows = tblUser.AsEnumerable().Where(x => x.Field<string>("user_id") == userId); 
+0

Спасибо, я действительно этого не видел. – Enemenemiste

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