小毛驴上回讲到,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;
}