我有一个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
部分,因为它不是一个简单的公司_ID
答案 0 :(得分:2)
根据here
尝试使用(例如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;
对于oracle:
//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();
答案 1 :(得分:1)
所以参数化查询(至少对我来说)通常意味着你已经在数据库上创建了一个存储过程,然后在传递相关参数时使用你的代码来执行存储过程。
这有几个好处
答案 2 :(得分:0)
我有答案。 c.CurrencyCode = '" + Code.Replace("'", "''") + "'
只需更改为c.CurrencyCode = ?code