Читая на форумах, этот вопрос часто возникает. Как и почему мы должны использовать параметры в наших 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));