SQLHelper为什么要这样写?续集

Source
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/xml1996/article/details/85784118

小毛驴上回讲到,SQLHelper从身为数据库的助手类的华丽变身。

上集回顾:

精彩镜头一:本来它需要展示她可以和数据库相连的语句:

string ConnStr= @"server = LMX-PC\SQLEXPRESS;database= newssystem; User ID= sa;Password = 123456"

可以通过配置文件把技能隐藏,只需要string connStr = ConfigurationManager.ConnectionStrings["connStr"].ConnectionString;

进行调用,如果需要修改技能,去配置文件里修改就可以,不用改变SQLHelper本身的任何一寸肌肤。

精彩镜头二:不仅如此:把SQLHelper内经常需要调用的方法属性抽象出来,增加了代码的可复用性,减少了没必要的代码重复。

具体可以回放:SQLHelper为什么要这样写?

本集集锦:

看点一:SQLHelper通过什么方式防止SQL注入

看点二:SQLHelper怎么样和存储过程建立联系的同时不增加新的SQLHelper类

SQLHelper进一步更新后使用了using结合博客:Using和Try...Catch后进行SQL执行增删改操作的语句

看点一:

        private SqlConnection conn = null;
        private SqlCommand cmd = null;
        private SqlDataReader sdr = null;
       
        public SQLHelper()//SQLHelper的构造方法
        {
           //提供应用程序对数据库的访问
            string connStr =ConfigurationManager.ConnectionStrings["connStr"].ConnectionString;
            conn = new SqlConnection(connStr);//与数据建立连接  
        }
 
        public SqlConnection GET()
        {
            //如果 数据库状态= 关闭
            if (conn.State ==ConnectionState.Closed )
            {
                conn.Open();//打开数据库
            }
            return conn;//返回
        }


    //SQL语句执行增删改操作 
    // 例子一;把SQL语句写在SQLHelper里
    public int ExecuteNonQuery(string sql)
     {
          int res;
          using ( SqlCommand cmd = new SqlCommand("insert into user_info(name)Values('"+Name+"')", GET())//using 会自己释放资源
           { 
               cmd.CommandType = CommandType.Text;//默认情况下是Text
               res = cmd.ExecuteNonQuery();        
           }
           return res;
      }
     //例子二:把sql换成具体的sql语句
    public int ExecuteNonQuery(string sql)
     {
          int res;
          using ( SqlCommand cmd = new SqlCommand("insert into user_info(name)values(@Name)", GET())//using 会自己释放资源
           { 
               cmd.Parameters.Add(new SqlParameter("@Name","小毛驴"));//插入一个小毛驴名字
               cmd.CommandType = CommandType.Text;//默认情况下是Text
               res = cmd.ExecuteNonQuery();        
           }
           return res;
      }
       
        //例子三:需要插入的不仅仅有名字,还有其他的性别,毛色
    public int ExecuteNonQuery(string sql)
     {
          int res;
          using ( SqlCommand cmd = new SqlCommand("insert into user_info(name,sex,colour)values(@Name,@Sex,@Colour)", GET())//using 会自己释放资源
           { 
               cmd.Parameters.AddRange(new SqlParameter("@Name","小毛驴"),
                                   new SqlParameter("@Sex","女"),
                                    new SqlParameter("@Colour","白色"));
               cmd.CommandType = CommandType.Text;//默认情况下是Text
               res = cmd.ExecuteNonQuery();        
           }
           return res;
      }
    

看点一解说:

例子一是把用户直接输入的内容插入到:insert into user_info(name)Values('"+Name+"')中的Name,这样用户输入的内容就会直接插入数据库进行查询。如果用户输入一串删除信息的代码,就会执行删除,这就是SQL注入:

SQL注入原理:通过构建特殊输入作为参数传入Web应用程序,这些输入大都是SQL语句里的一些组合,通过SQL语句进行执行攻击者要做的操作,导致用户数据泄露被修改。

通过例子二,有效解决了SQL注入的问题,但同时出现,如果需要插入或者查询的参数过多的情况就是会出现如下错误:SqlParameterCollection只接受非空的SqlParameter类型对象,不接受SqlParameter[]对象

 

这里就需要用例子三解决,这里要说一下Add和AddRange的区别:

cmd.Parameters.Add():添加一个参数,增加多个参数的时候,需要使用Foreach循环

cmd.cmd.Parameters.AddRange();添加一个参数的数组

看点二: 

    //例子二的基础之上的修改:
    public int ExecuteNonQuery(string sql)
     {
          int res;
          using ( SqlCommand cmd = new SqlCommand("insert into user_info(name)values(@Name)", GET())//using 会自己释放资源
           { 
               cmd.Parameters.Add(new SqlParameter("@Name","小毛驴"));//插入一个小毛驴名字
               cmd.CommandType = CommandType.StoredProcedure;//和存储过程建立联系
               res = cmd.ExecuteNonQuery();        
           }
           return res;
      }


     //例子四
    //sql就是"insert into user_info(name)values(@Name)"
    public int ExecuteNonQuery(string sql,CommandType ct)
     {
          int res;
          using ( SqlCommand cmd = new SqlCommand(sql, GET())//using 会自己释放资源
           { 
               cmd.Parameters.Add(new SqlParameter("@Name","小毛驴"));//插入一个小毛驴名字
               cmd.CommandType =ct;//和存储过程建立联系
               res = cmd.ExecuteNonQuery(); 
           }
           return res;
      }

小毛驴理解的很浅显,还需要你的指导,欢迎交流指正!