如何将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

如何将SQL语句更改为参数化查询

按这里

尝试使用(以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();

因此,参数化查询(至少对我来说)通常意味着您在数据库上创建了一个存储过程,然后使用代码在传递相关参数的同时执行该存储过程。

这有几个好处

  1. DRY—您不必在代码中重复查询,您可以调用execute方法并传入适当的参数
  2. 有助于防止SQL注入-您只能修改参数,这些参数在传递给查询
  3. 之前有望被消毒。
下面是如何根据MSDN 创建存储过程

下面是如何根据MSDN

执行存储过程

如果你决定通过LINQ来做,MSDN有你想要的

编辑:似乎你关心sql注入(这很好!),这里有一篇文章(再次来自MSDN),非常广泛地涵盖了这个主题

我有答案了。c.CurrencyCode = '" + Code.Replace("'", "''") + "'简单地变为c.CurrencyCode = ?code