【牛腩】6-17讲小结

        牛腩第6-17讲主要是讲解系统后台三层基本代码的编写,主要有SQLHelper的几次编写,还有类别表、新闻表、评论表的编写,其中也贯穿着SQL注入的问题和触发器存储过程的讲解,讲述的都很详细。

        【知识点】

          1、SQLHelper数据库助手类,在机房重构的时候都接触过,也不是陌生的东西,但是当时并不是很明白人家是怎么编写出来的。在牛腩视频中SQLHelper经过了一次编写两次重构,老师讲解的很详细,主要就是讲解带参数和不带参数的增删改或查询的SQL语句和存储过程,通过这次学习感觉有理解了很多。

        主要代码如下:

<span style="font-size:18px;">/*
 * 创建人:王文茹
 * 创建时间:2015-5-14
 * 说明:数据库助手类
 * 版权所有:
*/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data;
using System.Data.SqlClient;
using System.Configuration;
namespace DAL
{
    public class SQLHelper
    {
        private SqlConnection conn = null;
        private SqlCommand cmd = null;
        private SqlDataReader sdr = null;
        public SQLHelper()
        {
            string connStr = ConfigurationManager.ConnectionStrings["connStr"].ConnectionString;
            conn = new SqlConnection(connStr);
        }
        private SqlConnection GetConn()
        {
            if (conn.State == ConnectionState.Closed)
            {
                conn.Open();
            }
            return conn;
        }
        /// <summary>
        /// 执行不带参数的增删改SQL语句或存储过程
        /// </summary>
        /// <param name="cmdText">增删改SQL语句或存储过程</param>
        /// <param name="ct">命令类型</param>
        /// <returns></returns>
        public int ExecuteNonQuery(string cmdText,CommandType ct)
        {
            int res;
            try
            {
                cmd = new SqlCommand(cmdText , GetConn());
                cmd.CommandType = ct;
                res = cmd.ExecuteNonQuery();
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                if (conn.State == ConnectionState.Open)
                {
                    conn.Close();
                }
            }
            return res;
        }
        /// <summary>
        /// 执行带参数的SQL增删改语句或存储过程
        /// </summary>
        /// <param name="cmdText">SQL增删改语句或存储过程</param>
        /// <param name="paras">参数集合</param>
        /// <param name="ct">命令类型</param>
        /// <returns></returns>
        public int ExecuteNonQuery(string cmdText,SqlParameter[] paras,CommandType ct)
        {
            int res;
            using (cmd=new SqlCommand(cmdText ,GetConn()))
            {
                cmd.Parameters.AddRange(paras);
                cmd.CommandType = ct;
                //cmd.Parameters.AddRange(new SqlParameter[] { new SqlParameter("@caName", "哈哈新闻") });
                //cmd.Parameters.Add(new SqlParameter("@caName", "中国新闻c')delete category where id=6--"));
                res = cmd.ExecuteNonQuery();
            }
            return res;
        }
        /// <summary>
        /// 执行查询SQL语句或存储过程
        /// </summary>
        /// <param name="cmdText">执行查询SQL语句或存储过程</param>
        /// <param name="ct">命令类型</param>
        /// <returns></returns>
        public DataTable ExecuteQuery(string cmdText,CommandType ct)
        {
            DataTable dt = new DataTable();
            cmd = new SqlCommand(cmdText, GetConn());
            cmd.CommandType= ct;      //默认属性
            //关闭数据库连接
            using (sdr = cmd.ExecuteReader(CommandBehavior.CloseConnection))
            {
                dt.Load(sdr);
            }
            return dt;
        }
        /// <summary>
        /// 执行带参数的查询SQL语句或存储过程
        /// </summary>
        /// <param name="cmdText">执行带参数的查询SQL语句或存储过程</param>
        /// <param name="paras">参数集合</param>
        /// <param name="ct">命令类型</param>
        /// <returns></returns>
        public DataTable ExecuteQuery(string cmdText,SqlParameter[]paras,CommandType ct)
        {
            DataTable dt = new DataTable();
            cmd = new SqlCommand(cmdText , GetConn());
            cmd.CommandType = ct;
            cmd.Parameters.AddRange(paras);
            //关闭数据库连接
            using (sdr = cmd.ExecuteReader(CommandBehavior.CloseConnection))
            {
                dt.Load(sdr);
            }
            return dt;
        }
        
    }
}</span>
        2、类别表、新闻表、评论表的编写,主要就是过程中可以感觉到牛腩每一步写下来都很有条例,按着文档一步步做。这也体现出文档的重要性,以前自己编写的文档并没有起到很大的作用。还有就是编写过程中各种细节知识的讲解,比如将常使用的代码存到工具箱,以后用的话就可以直接拉出来,还有TODO注释的使用等等都是自己之前没有注意过得。

        3、SQL注入问题,以前没有接触过,说白了就是在界面的输入框中输入构造数据库语句可以对数据库进行相应操作,比如在输入框中输入{中国新闻')delete category where id=5--}相当于在数据库中执行insert into category(name) values('中国新闻c')delete category where id=5--')  语句。这样会使数据库存在严重的安全隐患,任何懂SQL语句的人都可以任意改动数据库,相当的不安全。视频中主要就是讲如何解决SQL注入的问题,视频中讲的很详细就不多说了。

        4、触发器和存储过程,之前也用过,存储过程能大大增强了SQL语言的功能和灵活性。存储过程可以用流控制语句编写,有很强的灵活性,可以完成复杂的判断和较复杂的 运算。可保证数据的安全性和完整性,很实用也很方便。

        系统中用到的存储过程如下:

【牛腩】6-17讲小结_第1张图片

        调用过程如下:

<span style="font-size:18px;"> #region 根据类别ID取出该类别下的所有新闻
        /// <summary>
        /// 根据类别ID取出该类别下的所有新闻
        /// </summary>
        /// <param name="caId"></param>
        /// <returns></returns>
        public DataTable SelectByCaId(string caId)
        {
            //TODO:根据类别ID取出该类别下的所有新闻
            DataTable dt = new DataTable();
            string cmdText = "procNewsSelectByCaId";
            SqlParameter[] paras = new SqlParameter[] { new SqlParameter("@caid", caId) };
            dt = sqlhelper.ExecuteQuery(cmdText, paras, CommandType.StoredProcedure);
            return dt;
        }
        #endregion</span>
         【小结】

         视频6-17讲完成了后台代码的基本编写,也用到三层,所以这部分并不陌生,可以从中看到机房重构的影子。我觉得主要学习的还是牛腩老师在讲述的过程中一些细节的东西,还有就是他整体编写代码的思路,很清晰。通过看别人编写代码的过程,发现自己知道的真的很少,要学习的东西还有很多。


你可能感兴趣的:(sql注入,博客)