Как изменить SQL-оператор для параметризованного запроса?
У меня есть SQL-запрос, который мне нужно изменить параметры, чтобы я мог избежать SQL-инъекций.
adapter.SelectCommand.CommandText = @"SELECT c.*,(Select Initials FROM users WHERE User_ID = c.CreatedByUser) AS CreatedBy, (SELECT Initials FROM users WHERE User_ID = c.ModifiedByUser) AS ModifiedBy FROM currency c WHERE c.Company_ID = " + Company_ID + " AND c.CurrencyCode = '" + Code.Replace("'", "''") + "' ORDER BY c.Description
adapter.SelectCommand.Parameters.Add(new MySqlParameter("company_ID", Company_ID));
adapter.SelectCommand.Parameters.Add(new MySqlParameter("code", Code));
Я знаю, что для Company_ID мне нужно изменить его на WHERE c.Company_ID = ?company_ID
но я не уверен, что делать для c.CurrencyCode = '" + Code.Replace("'", "''") + "'
Я просто не знаю, как изменить Code.Replace
часть, так как это не так просто, как company_ID
3 ответа
У меня есть ответ. c.CurrencyCode = '" + Code.Replace("'", "''") + "'
просто меняется на c.CurrencyCode = ?code
Согласно здесь
Попробуйте использовать (например, для odbc):
cmd.Parameters.Add("?CURRENCY", OdbcType.VarChar, Code.Replace("'", "''"))
Подход Odbc
OdbcCommand cmd = sql.CreateCommand();
cmd.CommandText = "SELECT UNIQUE_ID FROM userdetails WHERE USER_ID IN (?, ?)";
cmd.Parameters.Add("?ID1", OdbcType.VarChar, 250).Value = email1;
cmd.Parameters.Add("?ID2", OdbcType.VarChar, 250).Value = email2;
Для оракула:
//create SQL and insert parameters
OracleCommand cmd = new OracleCommand("insert into daily_cdr_logs (message) values (:_message)", con);
cmd.Parameters.Add(new OracleParameter("_message", msg));
Для MySQL:
cmd = new MySqlCommand("SELECT * FROM admin WHERE admin_username=@val1 AND admin_password=PASSWORD(@val2)", MySqlConn.conn);
cmd.Parameters.AddWithValue("@val1", tboxUserName.Text);
cmd.Parameters.AddWithValue("@val2", tboxPassword.Text);
cmd.Prepare();
Таким образом, параметризованный запрос (по крайней мере для меня) обычно означает, что вы создали хранимую процедуру в своей базе данных, а затем используете свой код для выполнения хранимой процедуры при передаче соответствующих параметров.
Это имеет несколько преимуществ
- СУХОЙ - вам не нужно повторять запрос в коде, вы можете просто вызвать метод execute и передать соответствующие параметры
- Помогает предотвратить внедрение SQL - вы можете изменять только те параметры, которые, как мы надеемся, будут очищены перед передачей в запрос
Вот как создать хранимую процедуру в соответствии с MSDN
а также
Вот как выполнить хранимую процедуру в соответствии с MSDN
Если вы решили сделать это через LINQ, MSDN найдет то, что вы ищете здесь
РЕДАКТИРОВАТЬ: Кажется, вы обеспокоены sql-инъекцией (что хорошо!), Вот статья (снова из MSDN), которая охватывает эту тему довольно широко