C# 如何将sql语句更改为参数化查询?
我有一个sql查询,我需要更改参数,以避免sql注入C# 如何将sql语句更改为参数化查询?,c#,mysql,sql,visual-studio-2010,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
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\u ID,我需要将其更改为其中c.Company\u ID=?Company\u ID
,但我不确定如何处理c.CurrencyCode='+code。替换(“'”,““”)+”
我只是不知道如何更改代码。更换部件,因为它不像公司ID那样简单
尝试使用(例如odbc):
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();
因此,参数化查询(至少对我来说)通常意味着您在数据库上创建了一个存储过程,然后在传递相关参数的同时使用代码执行该存储过程
这有几个好处
DRY-不必在代码中重复查询,只需调用execute方法并传入适当的参数即可
有助于防止SQL注入-您只能修改参数,希望这些参数在传递到查询之前会被清除
如何根据MSDN创建存储过程
及
如何根据MSDN执行存储过程
如果您决心通过LINQ来实现这一点,那么MSDN就具备了您所需要的功能
编辑:您似乎关心sql注入(这很好!),这篇文章(同样来自MSDN)非常广泛地涵盖了该主题我有答案c.CurrencyCode='“+code.Replace(“'”,“'”)+”
只需更改为c.CurrencyCode=?code
在SQL中使用参数并不局限于存储过程。非常正确,我实际上特别指出,对我来说,参数化查询被定义为在数据库中使用存储过程,然而,文章中的最后一个链接显示了一些使用LINQ之类的工具进行参数化查询的其他方法。我已经编辑了我的问题,以包含我所有的代码。我唯一的问题是如何更改语句中的Code.replace
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();