1 完整的删除与修改
删除和修改之前先进行查找,看看有没有这条记录。
(1)先查
bool bb = false;//定义中间变量
cm.CommandText = "select * from users where uname=@name";
//@key占位符,Parameters先清空,再添加。
cm.Parameters.Clear(); //清空,
cm.Parameters.Add("@name",name1); //添加
con.Open();
SqlDataReader dr1 = cm.ExecuteReader();
if(dr1.HasRows ) //判断有没有这条记录
{
bb = true;
}
con.Close();
(2)删除
if(bb)//记录存在,执行下面删除
{
Console.Write("您的用户名是『"+name1+"』,请确认是否删除(Y/N):");
string ss = Console.ReadLine().ToUpper();
if(ss=="Y")//用户确认删除
{
编写删除语句;
con.Open();
cm.ExecuteNonQuery();
con.Close();
Console.WriteLine("您的信息删除成功!");
}
Else //用户不修改
{
Console.WriteLine("您未进行信息删除!");
}
}
else//记录不存在,执行下面
{
Console.WriteLine("用户名『"+name1+"』不存在");
}
(3)修改
if(bb)//记录存在,执行下面修改
{
Console.Write("您的用户名是『"+name1+"』,请确认是否修改(Y/N):");
string ss = Console.ReadLine().ToUpper();
if(ss=="Y")//用户确认修改
{
编写修改语句;
con.Open();
cm.ExecuteNonQuery();
con.Close();
Console.WriteLine("您的信息修改成功!");
}
Else //用户不修改
{
Console.WriteLine("您未进行信息修改!");
}
}
else//记录不存在,执行下面
{
Console.WriteLine("用户名『"+name1+"』不存在");
}
2 SQL数据库字符串注入攻击
(1)攻击:控制台输入信息时加上“’;SQL语句;--”,这个语句会执行。
’; 结束上个语句 --注释掉后边的内容
(2)防止攻击:parameters ,@key占位符,先清空,再添加
Parameters这个集合中将此占位符所代表的数据补全。
如:
cm.CommandText = "select * from users where uname=@name";
cm.Parameters.Clear();
cm.Parameters.Add("@name",name1);
3 实体类和数据访问类
(1)实体类:封装
封装一个类,类名与数据库表名一致;成员变量名与列名一致,多一个下划线;
成员变量封装完的属性,就会与数据表中的列名一致。
每一行数据都可以存成一个对象,操作这个对象,就相当于对某一行数据进行整体操作。
public class users { private string _uname; public string Uname { get { return _uname; } set { _uname = value; } } private int _umima; public int Umima { get { return _umima; } set { _umima = value; } } private string _unicheng; public string Unicheng { get { return _unicheng; } set { _unicheng = value; } } private bool _usex; public bool usex { get {return _usex;} set { _usex = value; } } private DateTime _ubir; public DateTime Ubir { get { return _ubir; } set { _ubir = value; } } private string _uzu; public string Uzu { get { return _uzu; } set { _uzu = value; } } }
(2)数据访问类:
就是将对数据库的一些操作,单独写到一个类中,封成一些方法,等待调用
结构看起来会非常清晰。
//数据访问类
public class usersdata { SqlConnection conn = null; SqlCommand com = null; public usersdata()//结构化 { conn = new SqlConnection("server=.;database=lianxi;user=sa;pwd=123"); com = conn.CreateCommand(); } ///删除前先查用户是否存在 public bool chasg(string name)//查看时返回bool类型 { bool b = false; com.CommandText = "select * from users where uname=@name"; com.Parameters.Clear(); com.Parameters.Add("@name",name); conn.Open(); SqlDataReader dr = com.ExecuteReader(); if(dr.HasRows ) { b = true; } conn.Close(); return b; } ///删除 public void shan(string name) { com.CommandText = "delete from users where uname=@name"; com.Parameters.Clear(); com.Parameters.Add("@name",name ); conn.Open(); com.ExecuteNonQuery(); conn.Close(); } } //主函数 users u = new users();//实例化实体类 usersdata ud = new usersdata();实例化数据访问类 Console.Write("请输入要删除人的姓名:"); string name = Console.ReadLine(); bool bb = ud.chasg(name);//调用数据访问类中的查询方法 if (bb)//查询结果返回true,进行删除 { Console.Write("用户名存在"); ud.shan(name);//调用数据访问类中的删除方法 Console.Write("删除成功"); } else//查询结果返回false { Console.Write("用户名不存在"); }
4三层开发:
界面层 - UI层
业务逻辑层 - C#代码部分
数据访问层 - 实体类和数据访问类