SqlClient CommandText - свойствоNemiro.Data.dll
Текст SQL-запроса, либо имя хранимой процедуры, которую необходимо выполнить.

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

public string CommandText { get; set; }

Значение свойства

Тип: String
Заметки

Данное свойство является калькой с одноименного свойства класса SqlCommand.

Если свойство CommandType имеет значение Auto, то тип CommandText определяется автоматически.

Если необходимо передать в запрос какие-либо параметры, используйте для этого свойство Parameters. Не рекомендуется подставлять значения параметров напрямую в текст запроса, чтобы избежать возникнования уязвимости типа SQL Injection.

Примеры

В следующем примере выполняется SQL-запрос для удаления записей из таблицы table, у которых значение поля id равняется 10. Запрос выполняется методом ExecuteNonQuery .

using (SqlClient client = new SqlClient())
{
  client.CommandText = "DELETE FROM table WHERE id = 10";
  client.ExecuteNonQuery();
}

В следующем примере выполняется SQL инструкция для получения списка пользователей из таблицы users. В запрос передаются параметры age и sex через коллекцию Parameters, для выборки пользователей определенного типа.

Запрос выполняется методом GetTable . Результат передается в переменную table, после чего полученная таблица выводится в консоль.

using (SqlClient client = new SqlClient())
{
  client.CommandText = "SELECT first_name, last_name, age, sex FROM users WHERE age = @age AND sex = @sex";
  client.Parameters.Add("@age", SqlDbType.Int).Value = 30;
  client.Parameters.Add("@sex", SqlDbType.VarChar, 6).Value = "Female";
  var table = client.GetTable();
  foreach(var row in table.Rows)
  {
    Console.WriteLine("Имя: {0} {1}", row["first_name"], row["last_name"]);
    Console.WriteLine("Пол: {0}", row["sex"]);
    Console.WriteLine("Возраст: {0}", row["age"]);
  }
}

Следующий пример демонстрирует динамическое построение 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("'", "''"). Но это не все проблемы, с которыми можно столкнуться при подобном способе построения запросов. Именно поэтому лучше использовать параметризированные запросы, с использованием свойства Parameters, чтобы исключить вторжение из вне в содержимое запроса, а также проблем с преобразованием дат и чисел с плавающей точкой.

См. также