如何将SQL语句更改为参数化查询
本文关键字:参数 查询 SQL 语句 | 更新日期: 2023-09-27 17:50:58
我有一个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
按这里
尝试使用(以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();
因此,参数化查询(至少对我来说)通常意味着您在数据库上创建了一个存储过程,然后使用代码在传递相关参数的同时执行该存储过程。
这有几个好处
- DRY—您不必在代码中重复查询,您可以调用execute方法并传入适当的参数
- 有助于防止SQL注入-您只能修改参数,这些参数在传递给查询 之前有望被消毒。
和
下面是如何根据MSDN
执行存储过程如果你决定通过LINQ来做,MSDN有你想要的
编辑:似乎你关心sql注入(这很好!),这里有一篇文章(再次来自MSDN),非常广泛地涵盖了这个主题
我有答案了。c.CurrencyCode = '" + Code.Replace("'", "''") + "'
简单地变为c.CurrencyCode = ?code