亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

簡單的web三層架構系統【第二版】

2019-11-17 01:56:46
字體:
來源:轉載
供稿:網友

簡單的web三層架構系統【第二版】

昨天寫了 web三層架構的第一版,準確的說是三層架構的前期,頂多算是個二層架構,要慢慢完善。

第一版里,程序雖說能運行起來,但是有一個缺陷,就是里面的SQL語句,是使用的拼接字符進行執行。這樣安全系數很低,如果有心人的話,可能會SQL注入,重新拼接字符,然后篡改我們的數據庫內容,導致不可挽回的損失。

在第二版本,也就是這一版里,我對原來的SQL語句進行了重構,使用帶參數的SQL語句對數據庫進行操作,這樣做的好處是,無論用戶輸入的是什么格式的字符,SQL語句都會原封不動的把這些字符寫入到數據庫中,這樣就避免了有心人對字符進行拼接,導致數據庫出錯。

下面我用另一個小例子來說明防止SQL注入的核心代碼,在最后會給出我重構過的第一版程序,也就是今天要寫第二版程序:

這是DAO類中的insert方法:

 1         public bool insert(string name, string sex, string salary) 2         { 3             bool flag = false; 4  5             SqlParameter[] paras = new 6             { 7                 new SqlParameter("@name", name), 8                 new SqlParameter("@sex", sex), 9                 new SqlParameter("@salary", salary)10             };11 12             string sql = "insert into person ([name], sex, salary) values (@name, @sex, @salary)";13 14             if (sq.ExecuteNonQuery(sql, paras) > 0)    //把SQL語句和SQL參數同時傳入SQLHelper的ExecuteNonQuery中執行。15             {                   //16                 flag = true;17             }18 19             return flag;20    }

這是SQLHelper類中的ExecuteNonQuery方法:

 1         public int ExecuteNonQuery(string sql, SqlParameter[] paras) 2         { 3             int result; 4  5             cmd = new SqlCommand(sql, getcon());    //創建SQLcommand對象cmd 6  7             cmd.Parameters.AddRange(paras);         //在SQLcommand對象cmd中,添加參數。 8                               //上面的這一句注釋,是自己的理解,如果理解錯了,請在評論區幫忙指正一下,先謝過。 9             result = cmd.ExecuteNonQuery();         //然后執行對象cmd,其中已經包含了SQL語句和要用的參數10 11             return result;12       }

上面是一個小例子,創建了一張表,然后向表里的 NAME SEX SALARY 三個字段中添加內容。

下面是第二版web三層架構程序:

SQLhelper助手類:

  1 using System;  2 using System.Collections.Generic;  3 using System.Linq;  4 using System.Text;  5 using System.Threading.Tasks;  6   7 using System.Data;  8 using System.Data.SqlClient;  9 using System.Configuration; 10  11 namespace DAL 12 { 13     public class SQLHelper 14     { 15         SqlCommand cmd = null; 16  17         public string strcon() 18         { 19             string strcon = ConfigurationManager.ConnectionStrings["strcon"].ConnectionString; 20  21             return strcon; 22         } 23  24         public SqlConnection getcon() 25         { 26             SqlConnection con = new SqlConnection(strcon()); 27  28             if (con.State == ConnectionState.Closed) 29             { 30                 con.Open(); 31             } 32  33             return con; 34         } 35  36         #region 執行增刪改查的SQL語句 37         /// <summary> 38         /// 執行增刪改查的SQL語句 39         /// </summary> 40         /// <param name="sql">要執行的SQL</param> 41         /// <returns>返回執行SQL語句后影響的行數</returns> 42         public int ExecuteNonQuery(string sql) 43         { 44             int res; 45  46             try 47             { 48                 cmd = new SqlCommand(sql, getcon()); 49  50                 res = cmd.ExecuteNonQuery(); 51             } 52             catch (Exception ex) 53             { 54                 throw ex; 55             } 56             finally 57             { 58                 if (getcon().State == ConnectionState.Open) 59                 { 60                     getcon().Close(); 61                 } 62             } 63  64             return res; 65         } 66         #endregion 67  68         #region 執行帶參數的增刪改SQL語句 69         /// <summary> 70         /// 執行帶參數的增刪改SQL語句 71         /// </summary> 72         /// <param name="sql">要執行的SQL語句</param> 73         /// <param name="paras">傳入的參數</param> 74         /// <returns>返回受影響的行數</returns> 75         public int ExecuteNonQuery(string sql, SqlParameter[] paras)//上下兩個ExecuteNonQuery因為使用了方法的重載,其中參數不同,所以雖說都在調用ExecuteNonQuery,但是傳遞的參數的個數不同,系統會自動識別用哪一個ExecuteNonQuery方法。 76         { 77             int res; 78  79             cmd = new SqlCommand(sql, getcon());//  1   80  81             cmd.Parameters.AddRange(paras);//  2   84  85             res = cmd.ExecuteNonQuery(); 86  87             return res; 88         } 89         #endregion 90  91         #region 執行傳入的SQL查詢語句 92         /// <summary> 93         /// 執行傳入的SQL查詢語句 94         /// </summary> 95         /// <param name="sql">要執行的查詢SQL</param> 96         /// <returns>返回查詢SQL語句的數據集</returns> 97         public DataTable ExecuteQuery(string sql) 98         { 99             DataTable dt = new DataTable();100 101             //創建一個SqlCommand對象cmd,讓其連接數據庫,并指向sql語句。//自己理解,如果不對的話請在評論區指正,先謝過。102             cmd = new SqlCommand(sql, getcon());103 104             //執行cmd連接的數據庫.使用using后在執行完畢后,直接關閉sdr。不需要寫sdr.closed.105             using (SqlDataReader sdr = cmd.ExecuteReader(CommandBehavior.CloseConnection))//如果使用 CommandBehavior.CloseConnection 參數,那么在代碼的結尾處就不需要寫 getcon().Close(),他會直接關閉。106             {107                 dt.Load(sdr);// Load 這種方法適合于SqlDataReader。如果是SqlDataAdapter,則會用到 Fill 方法。108             }109 110             return dt;111         }112         #endregion113 114         #region 執行傳入帶參數的SQL查詢語句115         /// <summary>116         ///  執行傳入帶參數的SQL查詢語句117         /// </summary>118         /// <param name="sql">要執行的SQL語句</param>119         /// <param name="paras">傳入的參數</param>120         /// <returns>返回查詢的數據集</returns>121         public DataTable ExecuteQuery(string sql, SqlParameter[] paras)122         {123             DataTable dt = new DataTable();124 125             cmd = new SqlCommand("sql", getcon());126 127             cmd.Parameters.AddRange(paras);128 129             using (SqlDataReader sdr = cmd.ExecuteReader(CommandBehavior.CloseConnection))130             {131                 dt.Load(sdr);132             }133 134             return dt;135         }136         #endregion137     }138 }

personDAO員工操作類:

  1 using System;  2 using System.Collections.Generic;  3 using System.Linq;  4 using System.Text;  5 using System.Threading.Tasks;  6   7 using System.Data;  8 using System.Data.SqlClient;  9  10 namespace DAL 11 { 12     public class personDAO 13     { 14         SQLHelper sq = null; 15  16         public personDAO() 17         { 18             sq = new SQLHelper(); 19         } 20  21         #region 增加員工信息 22         /// <summary> 23         /// 增加員工信息 24         /// </summary> 25         /// <param name="name">要添加的員工姓名</param> 26         /// <param name="sex">要添加的員工性別</param> 27         /// <param name="salary">要添加的員工工資</param> 28         /// <returns>返回真假值:如果是真顯示添加成功,如果是假顯示添加失敗</returns> 29         public bool insert(string name, string sex, string salary) 30         { 31             bool flag = false; 32  33             SqlParameter[] paras = new SqlParameter[] 34             { 35                 new SqlParameter("@name", name), 36                 new SqlParameter("@sex", sex), 37                 new SqlParameter("@salary", salary) 38             }; 39  40             string sql = "insert into person ([name], sex, salary) values (@name, @sex, @salary)";//記住,添加參數的時候,不需要 雙引號 或是 單引號。 41  42             if (sq.ExecuteNonQuery(sql, paras) > 0)//把sql語句和所用到參數數組,一起傳送到 ExecuteNonQuery 中去執行。 43             { 44                 flag = true; 45             } 46  47             return flag; 48         } 49         #endregion 50  51         #region 刪除員工信息 52         /// <summary> 53         /// 刪除員工信息 54         /// </summary> 55         /// <param name="id">要刪除員工的id</param> 56         /// <returns>返回真假值:如果是真顯示刪除成功,如果是假顯示刪除失敗</returns> 57         public bool delete(string id) 58         { 59             bool flag = false; 60  61             SqlParameter[] paras = new SqlParameter[] 62             { 63                 new SqlParameter("@id", id) 64             }; 65  66             string sql = "delete from person where id = @id";//記住,添加參數的時候,不需要 雙引號 或是 單引號。 67  68             if (sq.ExecuteNonQuery(sql, paras) > 0) 69
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲欧美激情在线视频| 亚洲国产黄色片| 高清日韩电视剧大全免费播放在线观看| 欧美日韩中国免费专区在线看| 日本精品va在线观看| 国产精品爽爽ⅴa在线观看| 日韩电影中文字幕在线| 日韩在线www| 色噜噜狠狠色综合网图区| 中文字幕精品在线| 欧美野外猛男的大粗鳮| 欧美午夜女人视频在线| 高跟丝袜欧美一区| 国产精品女主播视频| 日韩在线观看免费高清| 日韩在线观看免费高清| 一区二区日韩精品| 国产精品第100页| 51午夜精品视频| 97欧美精品一区二区三区| 日韩在线激情视频| 日韩电影中文 亚洲精品乱码| 国产亚洲精品高潮| 国产热re99久久6国产精品| 日韩国产欧美精品一区二区三区| 日韩欧美aⅴ综合网站发布| 91夜夜揉人人捏人人添红杏| 亚洲视频一区二区三区| xxxxx成人.com| 亚洲欧洲自拍偷拍| 国产精品欧美风情| 岛国av午夜精品| 国产精品wwwwww| 亚洲精品视频网上网址在线观看| 久久久久久69| 永久免费看mv网站入口亚洲| 亚洲日本aⅴ片在线观看香蕉| 国产日韩欧美视频| 欧美激情一二区| 精品免费在线视频| 亚洲美女又黄又爽在线观看| 国产偷亚洲偷欧美偷精品| 午夜精品久久久久久久99热浪潮| 国产成一区二区| 欧美尺度大的性做爰视频| 国产一区私人高清影院| 久久久av网站| 国产欧美日韩91| 中文字幕久精品免费视频| 日韩国产欧美精品一区二区三区| 欧美电影免费观看大全| 国产日韩在线看| 亚洲日本中文字幕| 亚洲毛片在线看| 精品在线观看国产| 国产精品久久二区| 亚洲无限av看| 热久久免费视频精品| 亚洲激情在线观看| 欧美性做爰毛片| 日韩av在线免费播放| 日韩成人在线免费观看| 欧美激情一区二区三级高清视频| 爽爽爽爽爽爽爽成人免费观看| 亚洲欧美日韩久久久久久| 日韩av一区二区在线观看| 精品无人区乱码1区2区3区在线| 九色精品免费永久在线| 日本人成精品视频在线| 日韩免费在线视频| 狠狠色狠狠色综合日日小说| 欧美日韩爱爱视频| 91精品久久久久久久久久入口| 日韩欧美精品中文字幕| 欧美国产在线电影| 日本一区二区在线免费播放| 永久免费看mv网站入口亚洲| 久久久电影免费观看完整版| 国产精品第一区| 亚洲精品wwwww| 日韩免费在线播放| 亚洲成av人影院在线观看| 欧美在线中文字幕| 亚洲电影免费观看高清完整版| 日韩不卡中文字幕| 欧美野外猛男的大粗鳮| 久久久久久69| 午夜精品久久久久久久白皮肤| 日韩亚洲国产中文字幕| 国产精品对白刺激| 狠狠躁天天躁日日躁欧美| 欧美国产日本高清在线| 亚洲欧美日韩第一区| 九九综合九九综合| 日本精品久久电影| 欧美另类暴力丝袜| 成人一区二区电影| 成人综合网网址| 国产精品免费小视频| 日韩视频一区在线| 国产精品扒开腿做爽爽爽的视频| 成人高清视频观看www| 欧美美女操人视频| 亚洲精品成人久久| 亚洲国产成人精品女人久久久| 欧美一级片在线播放| 欧美专区在线播放| 青青草成人在线| 欧美夜福利tv在线| 欧美在线影院在线视频| 久久久国产在线视频| 日韩久久免费视频| 欧美激情一区二区三级高清视频| 亚洲国产成人久久| 亚洲国产婷婷香蕉久久久久久| 精品久久久久人成| 亚洲精品第一国产综合精品| 欧美性色xo影院| 欧美韩国理论所午夜片917电影| 国产成人精品一区二区| 不卡av在线播放| 色综合久久久888| 成人h视频在线观看播放| 萌白酱国产一区二区| 久久国产精品久久国产精品| 九九久久精品一区| 日韩在线观看精品| 国产成人精品一区| 97视频在线观看视频免费视频| 欧美亚洲一级片| 欧美日韩黄色大片| www国产精品com| 欧美刺激性大交免费视频| 国产精品老女人精品视频| 精品国偷自产在线| 日韩黄色高清视频| 日韩国产中文字幕| 在线不卡国产精品| 亚洲第一区中文字幕| 影音先锋欧美在线资源| 亚洲丝袜一区在线| 97免费中文视频在线观看| 欧美精品电影在线| 亚洲成年网站在线观看| 亚洲一区中文字幕在线观看| 亚洲国产97在线精品一区| 国产xxx69麻豆国语对白| 国产在线高清精品| 久久国产精品久久久久| 欧美一级黑人aaaaaaa做受| 国外色69视频在线观看| www.日本久久久久com.| 午夜精品视频网站| 福利一区视频在线观看| 97香蕉久久夜色精品国产| 91高清免费视频| 亚洲自拍高清视频网站| 久久av在线播放| 色综合久久天天综线观看| 亚洲精品日韩激情在线电影| 日韩成人网免费视频| 亚洲自拍高清视频网站| 亚洲第一中文字幕| 国产欧美精品一区二区三区介绍|