SqlClient GetData(String) - методNemiro.Data.dll
Выполняет указанную SQL-инструкцию и возвращает DataSet. Не рекомендуется использовать этот метод, чтобы избежать возникновение SQL Injection при неправильном построении запроса. Лучше используйте одну из перегрузок этого метода: GetData  или GetData(SqlCommand).

Пространство имён: Nemiro.Data.Sql
Сборка: Nemiro.Data (в Nemiro.Data.dll) Версия: 2.11.4.126 (2.11.4.126)
Синтаксис

public DataSet GetData(
	string sql
)

Параметры

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). ;-)

См. также