Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何将sql语句更改为参数化查询?_C#_Mysql_Sql_Visual Studio 2010 - Fatal编程技术网

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

我有一个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\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();