Статьи

Параметризованные SQL-запросы

Читая на форумах, этот вопрос часто возникает. Как и почему мы должны использовать параметры в наших SQL-запросах?

Обо всем по порядку. Вот параметризованный запрос:

sqlConnection1.Open(); SqlCommand comm = new SqlCommand("select * from foo where id=@fooId",sqlConnection1); // Create a new parameter with the name of the parameter and in this case the value SqlParameter idParam = new SqlParameter("@fooId",1004); comm.Parameters.Add(idParam); SqlDataReader dr = comm.ExecuteReader();

sqlConnection1.Open(); SqlCommand comm = new SqlCommand("select * from foo where id=@fooId",sqlConnection1); // Create a new parameter with the name of the parameter and in this case the value SqlParameter idParam = new SqlParameter("@fooId",1004); comm.Parameters.Add(idParam); SqlDataReader dr = comm.ExecuteReader();

sqlConnection1.Open(); SqlCommand comm = new SqlCommand("select * from foo where id=@fooId",sqlConnection1); // Create a new parameter with the name of the parameter and in this case the value SqlParameter idParam = new SqlParameter("@fooId",1004); comm.Parameters.Add(idParam); SqlDataReader dr = comm.ExecuteReader();

sqlConnection1.Open(); SqlCommand comm = new SqlCommand("select * from foo where id=@fooId",sqlConnection1); // Create a new parameter with the name of the parameter and in this case the value SqlParameter idParam = new SqlParameter("@fooId",1004); comm.Parameters.Add(idParam); SqlDataReader dr = comm.ExecuteReader();

Обратите внимание, что в нашем выражении SQL мы помещаем параметры с префиксом «@», где мы обычно вводим необработанные данные. Затем создается параметр с именем этой подстановки и значением, которое нужно ввести.

преимущества

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

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

MySQL и параметры

Но не все разработчики .NET используют SQL Server. Некоторые СУБД, включая mySQL, не используют именованные параметры; то есть вы не можете указать имя для параметров, которые нужно добавить.

Следовательно, вопросительный знак «?» Используется для указания того, что параметр используется в инструкции SQL, а параметры добавляются в порядке появления в инструкции, например:

OdbcCommand comm = new OdbcCommand("INSERT INTO myUsers(name, address, telephone, postcode) VALUES(?, ?, ?, ?);", odbcConn);

comm.Parameters.Add (new OdbcParameter («», strName));

comm.Parameters.Add (new OdbcParameter («», strAddress));

comm.Parameters.Add (new OdbcParameter («», strTelephone));

comm.Parameters.Add (new OdbcParameter («», strPostcode));