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

时间:2015-05-28 13:28:42

标签: c# mysql sql visual-studio-2010

我有一个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

3 个答案:

答案 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)

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

这有几个好处

  1. DRY - 您不必在代码中重复查询,只需调用execute方法并传入适当的参数
  2. 帮助防止SQL注入 - 您只能修改希望在传递给查询之前进行清理的参数
  3. Here是如何根据MSDN

    创建存储过程的

    Here是如何根据MSDN

    执行存储过程的

    如果您决定通过LINQ进行此操作,MSDN会提供您所需的内容here

    编辑:您似乎关注sql-injection(这很好!),here是一篇文章(再次来自MSDN),它非常广泛地涵盖了该主题

答案 2 :(得分:0)

我有答案。 c.CurrencyCode = '" + Code.Replace("'", "''") + "'只需更改为c.CurrencyCode = ?code