参数化防SQL注入

private void AddStudent(){

 string strName =txtName.Text.Trim();

 string strPwd = txtPwd.Text.Trim();

string strSql ="insert into Student (name,pwd)  values(@name,@pwd) ";

SqlConnection conn = new SqlConnection("  server=.;database=TestDB;uid=sa;pwd=pwd123 ");

SqlCommand cmd = new SqlCommand(strSql,conn); 

//参数数组 对应Sql语句中的参数

SqlParameter [] paras ={

  new SqlParameter("@name",strName),

  new SqlParameter("@pwd",strPwd)

    };

cmd.Parameters.AddRange(paras);

conn.Open();

int result = Convert.ToInt32(cmd.ExecuteScalar());

conn.Close();

if(result>0){

...

}eles{

...

}

}

上面的代码是访问SQL Server数据库的代码。如果本文中提到的数据分别在Access、MySQL、Oracle数据库,那么对应的参数化SQL语句及参数分别如下:

数据库 Access MySQL Oracle
 SQL语句 select * from UserInfo where sex=? and age>? select * from UserInfo where sex=?sex and age>?age select * from UserInfo where sex=:sex and age>:age
参数 OleDbParameter MySqlParameter OracleParameter
实例化参数 OleDbParameter p=new OleDbParameter(“?”, OleDbType. Boolean); MySqlParameter p=new MySqlParameter(“?sex”, MySqlDbType.Bit); OracleParameter p=new OracleParameter(“:sex”, OracleType.Byte);
赋值 p.Value=true; p.Value=1; p.Value=1;

      通过上面的实例代码我们可以看出尽管SQL语句大体相似,但是在不同数据库的特点,可能参数化SQL语句不同,例如在Access中参数化SQL语句是在参数直接以“?”作为参数名,在SQL Server中是参数有“@”前缀,在MySQL中是参数有“?”前缀,在Oracle中参数以“:”为前缀。
注意:因为在Access中参数名都是“?”,所以给参数赋值一定要按照列顺序赋值,否则就有可能执行出错。

以下是 oracle数据库中:

  public DataTable CheckUser(string userName, string pwd)
        {

            OracleConnection conn = new OracleConnection(connStr);
            DataTable dt = new DataTable();
            string sql = string.Format(@"SELECT 
                                                    GUID, USERNAME, PWD, 
                                                       CREATEDATE,NICKNAME
                                                    FROM F_USERS WHERE status =1  and USERNAME =:USERNAME and PWD =:PWD");
            try
            {

                //参数数组 对应Sql语句中的参数
                OracleParameter[] paras ={
                   new OracleParameter(":USERNAME",userName),
                   new OracleParameter(":PWD",pwd)
                   };

                OracleCommand cmd = new OracleCommand(sql, conn);
                cmd.Parameters.AddRange(paras);
                conn.Open();
                OracleDataAdapter oda = new OracleDataAdapter(cmd);
                oda.Fill(dt);
                return dt;
            }
            catch
            {
                return dt;
            }
            finally
            {
                conn.Close();
            }
        }
原文地址:https://www.cnblogs.com/zhangruiBlog/p/4251678.html