Сборка: Nemiro.Data (в Nemiro.Data.dll) Версия: 2.11.4.126 (2.11.4.126)
Параметры
- sql
- Тип: System String
Запрос SQL, который необходимо выполнить. Будьте очень осторожны при динамическом формировании запроса, особенно при передаче в запрос строковых типов данных.
Возвращаемое значение
Тип: DataSetЕсли запрос успешно выполнен, возвращает DataSet, содержащий результат выполнения запроса.
Если запрос не дал результатов, возвращает пустой DataSet.
Исключение | Условие |
---|---|
SqlException | Исключение возникает при возврате SQL Server предупреждения или ошибки. |
Следующий пример демонстрирует выполнение двух инструкций SELECT FROM, для получения данных из двух таблиц: messages и users. В случае успешного выполнения запроса, в DataSet в свойстве Tables будет две таблицы, содержащие результат выполнения запроса.
using (SqlClient c = new SqlClient()) { // выполняем запрос DataSet data = c.GetData("SELECT * FROM messages; SELECT * FROM users;"); if(data.Tables.Count > 0) { // есть данные, выводим в консоль foreach(DataTable t in data.Tables) { foreach(DataRow r in table.Rows) { Console.WriteLine("id = {0}", r["id"]); } } } }
Следующий пример демонстрирует динамическое построение SQL-запроса в веб-проекте. В запрос передается значение из параметра search адресной строки. Например, адрес страницы может быть следующим: http://example.org/users?search=pupkin.
Этот код содержит уязвимость типа SQL Injection. Поскольку любой пользователь имеет доступ к своей адресной строке и может указать туда все, что угодно, в том числе любую SQL-инструкцию. Например, чтобы удалить все данные из таблицы, достаточно указать следующий адрес страницы: http://example.org/users?search='; DELETE FROM users; --
Именно поэтому не рекомендуется использовать подобные методы построения SQL-запросов, лучше используйте методы GetData или GetData(SqlCommand).
using (SqlClient c = new SqlClient()) { // выполняем запрос DataSet data = c.GetData("SELECT * FROM users WHERE first_name LIKE '%" + Request["search"] + "%'"); if(data.Tables.Count > 0) { // есть данные, выводим в консоль foreach(DataTable t in data.Tables) { foreach(DataRow r in table.Rows) { Console.WriteLine("id = {0}", r["id"]); } } } }
Избежать инъекции, в данном примере, можно сделав проверку на наличие в параметре символа одинарной кавычки или экранировать кавычки: Request["search"].Replace("'", "''"). Но это не все проблемы, с которыми можно столкнуться при подобном способе построения запросов. Именно поэтому не рекомендуется использовать подобные методы построения SQL-запросов, лучше используйте методы GetData или GetData(SqlCommand). ;-)