Сборка: Nemiro.Data (в Nemiro.Data.dll) Версия: 2.11.4.126 (2.11.4.126)
Значение свойства
Тип: 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, чтобы исключить вторжение из вне в содержимое запроса, а также проблем с преобразованием дат и чисел с плавающей точкой.