為什么要參數化執行SQL語句呢?
一個作用就是可以防止用戶注入漏洞。
簡單舉個列子吧。
比如賬號密碼登入,如果不用參數,
寫的簡單點吧,就寫從數據庫查找到id和pw與用戶輸入一樣的數據吧
sql:select id,pw where id='inputID' and pw='inputPW';
一般情況沒什么問題,但如果用戶輸入的id或PW帶 ‘ ,這是可能就會出現漏洞,bug了
比如用戶輸入的id是: 1‘ or ’1‘=‘1
這是sql語句執行的是:select id,pw where id='1‘ or ’1‘=‘1 ‘ and pw='inputPW';
那數據庫里的所有賬號密碼都符合這個條件了。
簡而言之,用戶可以通過 ' 來改變你SQL的執行。
參數化就可以避免這個問題了。
/************************非查詢操作*****************************************/ //今天太晚了,先寫個非查詢操作的,明天在寫查詢操作的。 /****函數*****/ /// <summary> /// 增刪改數據,返回影響行數,沒有則返回-1 /// </summary> /// <param name="sql">sql語句</param> /// <param name="ps">參數</param> /// <returns>返回影響行數</returns> static string connStr ="server=IP;User Id=賬號名;password=密碼;Database=表名"; public static int ExecuteNonQuery(string sql, params MySqlParameter[] ps) { using (MySqlConnection conn = new MySqlConnection(connStr)) { using (MySqlCommand cmd = new MySqlCommand(sql, conn)) { cmd.Parameters.AddRange(ps); conn.Open(); return cmd.ExecuteNonQuery();//返回受影響行數 } } } /****應用舉例****/ public void InsertData() { int cid=1,aid=2; string name="hha"; string sql = "insert into tb_compart (compartID,compartName,areaID)values(@compartID,@compartName,@areaID);"; MySqlParameter[] ps ={ new MySqlParameter("@compartID",(object)cid), new MySqlParameter("@compartName",name), new MySqlParameter ("@areaID",(object)aid)}; int r = Mysql.MySQLHelper.ExecuteNonQuery(sql, ps);//r得值就是受影響的行數,執行失敗r=-1; } }