一、完整修改和查询

在编写c#语句时需考虑到用户体验,例如在编写修改语句时,需要考虑到输入的内容在数据库中是否能够找到。

中间变量运用

1、先查

2、执行操作

完整修改语句:

 bool has = false;

            Console.Write("请输入要修改的用户名:");
string Uname = Console.ReadLine();
//到数据库中查询输入的用户名是否存在
SqlConnection conn = new SqlConnection("server=.;database=Data0720;user=sa;pwd=123");//连接数据库
SqlCommand cmd = conn.CreateCommand();//数据库操作
cmd.CommandText = "select *from Users where UserName='" + Uname + "'";
conn.Open();//打开数据库
SqlDataReader dr = cmd.ExecuteReader();
if (dr.HasRows)
{
has = true;
}
conn.Close();//关闭数据库 if (has)
{
Console.WriteLine("已经查到[" + Uname + "]用户信息,请进行修改");
Console.Write("请输入修改后的密码:");
string Pwd = Console.ReadLine();
Console.Write("请输入修改后的昵称:");
string Nname = Console.ReadLine();
Console.Write("请输入修改后的性别:");
string Sex = Console.ReadLine();
Console.Write("请输入修改后的生日:");
string Birthday = Console.ReadLine();
Console.Write("请输入修改后的民族:");
string Nation = Console.ReadLine(); //@key 占位符
cmd.CommandText = " update Users set PassWord=@pwd,NickName=@nname,Sex=@sex,Birthday=@bir,Nation=@nat where UserName=@uname;";
cmd.Parameters.Clear();
cmd.Parameters.Add("@pwd", Pwd);
cmd.Parameters.Add("@nname",Nname);
cmd.Parameters.Add("@sex", (Sex=="男")?"":"");
cmd.Parameters.Add("@bir", Birthday);
cmd.Parameters.Add("@nat", Nation);
cmd.Parameters.Add("@uname", Uname); conn.Open();
cmd.ExecuteNonQuery();
conn.Close();
Console.WriteLine("修改完毕!");
}
else
{
Console.WriteLine("未查到[" + Uname + "]用户信息,请确认用户名输入是否正确!");
}

完整删除语句:

bool has = false;

            Console.Write("请输入要删除的用户名:");
string Uname = Console.ReadLine();
//查询要删除的用户名在数据库中是否存在
SqlConnection conn = new SqlConnection("server=.;database=Data0720;user=sa;pwd=123");
SqlCommand cmd = conn.CreateCommand();
cmd.CommandText = "select *from Users where UserName='" + Uname + "'";
conn.Open();
SqlDataReader dr = cmd.ExecuteReader();
if (dr.HasRows)
{
has = true;
}
conn.Close(); if (has)
{
Console.WriteLine("已经查到[" + Uname + "]用户信息,是否确定要删除吗?(Y/N):");
string u = Console.ReadLine();
if (u.ToUpper() == "Y")//确定删除
{
cmd.CommandText = "delete from Users where UserName='" + Uname + "'";
conn.Open();
cmd.ExecuteNonQuery();
conn.Close();
Console.WriteLine(Uname + "删除成功!");
}
}
else
{
Console.WriteLine("未查到[" + Uname + "]用户信息,请确认用户名输入是否正确!");
}

二、SQL数据库字符串注入攻击

需要使用cmd.Parameters这个集合
占位符: @key 代表这个位置用这个占位符占住了

arameters这个集合中将此占位符所代表的数据补全

cmd.Parameters.Clear(); --添加占位符数据之前,要清空此集合
cmd.Parameters.Add("@pwd", Pwd); --占位符内容填充
cmd.Parameters.Add("@nname",Nname);
cmd.Parameters.Add("@sex", (Sex=="男")?"1":"0");
cmd.Parameters.Add("@bir", Birthday);
cmd.Parameters.Add("@nat", Nation);
cmd.Parameters.Add("@uname", Uname);

三、实体类,数据访问类

1.实体类:封装
封装一个类,类名与数据库表名一致
成员变量名与列名一致,多一个下划线
成员变量封装完的属性,就会与数据表中的列名一致

每一行数据都可以存成一个对象,操作这个对象,就相当于对某一行数据进行整体操作

2.数据访问类:

就是将对数据库的一些操作,单独写到一个类中,封成一些方法,等待调用

结构看起来会非常清晰。

3.三层开发:
界面层 - UI层
业务逻辑层 - C#代码部分
数据访问层 - 实体类和数据访问类

 //实体类
public class stu
{
private string _xuehao;
/// <summary>
/// 学号
/// </summary>
public string Xuehao
{
get { return _xuehao; }
set { _xuehao = value; }
} private string _name;
/// <summary>
/// 学生姓名
/// </summary>
public string Name
{
get { return _name; }
set { _name = value; }
}
private bool _sex;
/// <summary>
/// 性别
/// </summary>
public bool Sex
{
get { return _sex; }
set { _sex = value; }
}
private string _banji;
/// <summary>
/// 班级
/// </summary>
public string Banji
{
get { return _banji; }
set { _banji = value; }
}
private DateTime _bir;
/// <summary>
/// 出生年月
/// </summary>
public DateTime Bir
{
get { return _bir; }
set { _bir = value; }
}
//数据访问类
public class studata
{
SqlConnection conn = null;//数据连接与操作
SqlCommand cmd = null; public studata()//构造函数
{
conn = new SqlConnection("server=.;database=new01;user=sa;pwd=123");
cmd = conn.CreateCommand();
}
/// <summary>
/// 查询数据库
/// </summary>
public void Select()
{
cmd.CommandText = "select *from stu";//查询语句
conn.Open();//打开数据库
SqlDataReader dr = cmd.ExecuteReader();//调用此方法用来查询
while (dr.Read())
{
Console.WriteLine(dr["xuehao"] + "\t" + dr["name"] + "\t" + ((bool)dr["sex"] ? "男" : "女") + "\t" + dr["banji"] + "\t" + Convert.ToDateTime(dr["bir"]).ToString("yyyy-MM-dd"));
}
conn.Close();//关闭数据库
}
/// <summary>
/// stu表添加方法
/// </summary>
/// <param name="s">要添加到数据库的stu对象</param>
public void insert(stu s)
{
cmd.CommandText = "insert into stu values(@xuehao,@name,@sex,@banji,@bir)";
cmd.Parameters.Clear();//清空此集合
cmd.Parameters.AddWithValue("@xuehao",s.Xuehao);
cmd.Parameters.AddWithValue("@name", s.Name);
cmd.Parameters.AddWithValue("@sex", s.Sex );
cmd.Parameters.AddWithValue("@banji", s.Banji);
cmd.Parameters.AddWithValue("@bir", s.Bir);
conn.Open();
cmd.ExecuteNonQuery();
conn.Close();
}
/// <summary>
/// 查询是否存在
/// </summary>
/// <param name="xuehao"></param>
/// <returns></returns>
public stu select(string xuehao)
{
stu s = null;
cmd.CommandText = "select *from stu where xuehao=@a";
cmd.Parameters.Clear();
cmd.Parameters.Add("@a", xuehao);
conn.Open();
SqlDataReader dr = cmd.ExecuteReader();
if(dr.HasRows)
{
dr.Read();
s = new stu();
s.Xuehao=dr["xuehao"].ToString();
s.Name=dr["name"].ToString();
s.Banji = dr["banji"].ToString();
s.Sex = Convert.ToBoolean(dr["sex"]);
s.Bir = Convert.ToDateTime(dr["bir"]);
}
conn.Close();
return s; }
/// <summary>
/// 修改
/// </summary>
/// <param name="s">要修改到数据库的stu对象</param>
public void update(stu s)
{
cmd.CommandText = "update stu set name=@name,sex=@sex,banji=@banji,bir=@bir where xuehao=@xuehao";
cmd.Parameters.Clear();//清空此集合
cmd.Parameters.AddWithValue("@xuehao", s.Xuehao);
cmd.Parameters.AddWithValue("@name",s.Name);
cmd.Parameters.AddWithValue("@sex", s.Sex);
cmd.Parameters.AddWithValue("@banji", s.Banji);
cmd.Parameters.AddWithValue("@bir",s.Bir);
conn.Open();
cmd.ExecuteNonQuery();
conn.Close();
}
/// <summary>
/// 删除
/// </summary>
/// <param name="xuehao"></param>
/// <returns></returns>
public bool delete(string xuehao)
{
bool delOK = false;
cmd.CommandText = "delete from stu where xuehao =@a";
cmd.Parameters.Clear();
cmd.Parameters.Add("@a", xuehao);
conn.Open();
try
{
cmd.ExecuteNonQuery();
delOK = true;
}
catch { } conn.Close();
return delOK;
}
}
//c#代码部分
studata sdata = new studata();//实例化studata这个类
Console.WriteLine("学号" + "\t" + "姓名" + "\t" + "性别" + "\t" + "班级" + "\t" + "生日");
sdata.Select();
Console.ReadLine();
Console.Write("请输入你想执行的操作(1添加,2修改,3删除):");
try//异常保护
{
int code = int.Parse(Console.ReadLine());
if (code == || code == || code == )
{
if (code == )//添加
{
stu s = new stu();//实例化
string[] x = new string[];
while (true)
{
Console.Write("请输入您要输入的学生学号:");
x[] = Console.ReadLine();
if (x[] == "")
{
Console.WriteLine("学号不能为空");
}
else if (x[].Length != || x[].StartsWith("S") != true)
{
Console.WriteLine("学号输入有误,必须以S开头");
}
else
{
stu s2 = sdata.select(x[]);
if (s2!=null)
{
Console.WriteLine("此学号已经存在,请重新输入!");
}
else
{
break;
}
}
}
s.Xuehao = x[];
Console.Write("请输入您要输入的学生姓名:");
s.Name = Console.ReadLine();
while (true)
{
Console.Write("请输入您要输入的学生性别(false代表女,true代表男):");
x[] = (Console.ReadLine()).ToLower();
if (x[] == "true" || x[] == "false")
{
break;
}
else
{
Console.WriteLine("性别代码输入有误!");
}
}
s.Sex = Convert.ToBoolean(x[]);
Console.Write("请输入您要输入的学生班级:");
s.Banji = Console.ReadLine();
Console.Write("请输入您要输入的学生生日:");
s.Bir = Convert.ToDateTime(Console.ReadLine());
sdata.insert(s);//调用sdata中的insert方法
sdata.Select();//调用sdata中的Select方法
}
//修改
else if (code == )
{
stu s = new stu();//实例化
Console.Write("请输入您要修改的学生的学号:");
s.Xuehao = Console.ReadLine();
//判断输入的学号在数据库中是否存在
stu s2 = sdata.select(s.Xuehao);//将输入的学号调入sdata中的select方法中,并赋值给s2
if (s2 != null)
{
Console.WriteLine("已查到此信息,按任意键修改");
Console.ReadKey();
Console.Write("请输入您修改后的学生姓名:");
s.Name = Console.ReadLine();
string[] x = new string[];
while (true)
{
Console.Write("请输入您修改后的学生性别(false代表女,true代表男):");
x[] = (Console.ReadLine()).ToLower();
if (x[] == "true" || x[] == "false")
{
break;
}
else
{
Console.WriteLine("性别代码输入有误!");
}
}
s.Sex = Convert.ToBoolean(x[]);
Console.Write("请输入您修改后的学生班级:");
s.Banji = Console.ReadLine();
Console.Write("请输入您修改后的学生生日:");
s.Bir = Convert.ToDateTime(Console.ReadLine());
sdata.update(s);//调用sdata中的update方法
Console.WriteLine("修改成功");
sdata.Select();//调用sdata中的Select方法
}
else
{
Console.WriteLine("未查到有关信息,请查看是否输错");
}
}
else
{
stu s = new stu();
Console.Write("请输入您要删除的学生的学号:");
s.Xuehao = Console.ReadLine();
//判断输入的学号在数据库中是否存在
stu s2 = sdata.select(s.Xuehao);
if (s2 != null)
{
Console.WriteLine("已查到此信息,请按任意键删除");
Console.ReadKey();
bool ok = sdata.delete(s.Xuehao);
if (ok)
{
Console.WriteLine("删除成功!");
sdata.Select();
}
else
Console.WriteLine("删除失败!");
}
else
Console.WriteLine("未查到有关信息,请查看是否输错");
}
}
else
{
Console.WriteLine("您输入有误!");
}
}
catch
{
Console.WriteLine("您输入的不是数字!");
}
Console.ReadLine();

简单学生管理系统

ADO.NET(完整修改和查询、实体类,数据访问类)的更多相关文章

  1. 9_13学习完整修改和查询&&实体类,数据访问类

    完整修改和查询:中间变量运用. 1.先查 2.执行操作 ---------------------------------------------------- namespace ADO.NET_小 ...

  2. ado.net 实体类_数据访问类

    实体类: using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ...

  3. ADO.net 实体类 、数据访问类

    程序分三层:界面层.业务逻辑层.数据访问层 比较规范的写程序方法,要把业务逻辑层和数据访问层分开,此时需要创建实体类和数据访问类 实体类: 例 using System; using System.C ...

  4. ADO,NET 实体类 和 数据访问类

    啥也不说,看代码. --SQl中 --建立ren的数据库,插入一条信息 create database ren go use ren go create table xinxi ( code ) pr ...

  5. ADO.NET 完整修改、删除、防字符串攻击

    首先,我先把昨天所做的人事管理系统进行了优化,将其完善成为了一个更符合实际的系统.将修改及删除数据的数据库操作前面添加了一个查询语句,这样,在实际操作时,如果数据库中没有该条数据,则程序不会执行接下来 ...

  6. ADO.NET 【实体类】【数据访问类】

    认识分层结构,分层式结构是最常见,也是最重要的一种结构. 三层架构(3-tier architecture) 界面层(User Interface layer) 主要对用户的请求接受,以及数据的返回, ...

  7. ADO.NET 数据访问类查询、属性扩展

    今天,我首先在之前所做的人员管理系统的基础上,利用数据访问类进行了所有人员信息的查询. 主程序代码: List<Users> Ulist = new UsersData().Select( ...

  8. 【2017-04-20】Ado.Net与面向对象结合架构中的数据访问层(实体类,数据访问类)

    开发项目三层架构:界面层.业务逻辑层.数据访问层 今天学习一下数据访问层,分为实体类和数据访问类 所有的类放在App_Code这个文件夹下边.养成一个好的习惯. 一.实体类 数据库中的表映射为一个类, ...

  9. ADO.NET(一) 空间 ADO.NET结构 命名空间(车延禄) System.Data—— 所有的一般数据访问类 S(转载)

    ADO.NET(一) 空间   ADO.NET结构 命名空间(车延禄)System.Data—— 所有的一般数据访问类System.Data.Common—— 各个数据提供程序共享(或重写)的类Sys ...

随机推荐

  1. centOS 6.x 版本安装 node.js 4.x 以上版本的方法

    由于 node 4.x 以上版本,通过编译源代码来安装,对 GCC 的版本有要求,而 centos 的 GCC 版本不够,更新 GCC 也很麻烦,所以只能通过别的方式解决. 这里主要介绍直接下载编译后 ...

  2. 编写linux驱动所用到的头文件(转)

    转自:http://blog.csdn.net/lufeiop02/article/details/6448497 关于linux驱动(应用)程序头文件使用 收藏 驱动程序: #include < ...

  3. mysql SQL SERVER 的算法

    Filesort Probes http://dev.mysql.com/doc/refman/5.7/en/dba-dtrace-ref-filesort.html http://dev.mysql ...

  4. mysql optimization

    EXPLAIN 命令详解 http://www.cnblogs.com/gomysql/p/3720123.html http://www.cnblogs.com/Aiapple/p/5697229. ...

  5. Maximum number of WAL files in the pg_xlog directory (1)

      Guillaume Lelarge: Hi, As part of our monitoring work for our customers, we stumbled upon an issue ...

  6. datagrid combobox事件更新编辑状态下的datagrid行

    请问如何从上图状态 点击下拉的combobox中值然后在不取消datagrid编辑状态下更新这一行另一列的数据,达到下图这样的效果: 非常感谢! 给你的combobox  绑定一个onSelect 事 ...

  7. objective-c 一个链式加法计算器实现

    一个链式加法计算器实现思路 1.使用时的效果 Calculate * manger=[Calculate new]; int result=manger.add(123).add(123).sub(1 ...

  8. EDIUS设置采集磁带的方法

    EDIUS作为一款应用广泛的非线性视频编辑软件,将磁带记录的视频信号采集为可以编辑的数字视频信号的使用还是十分广泛的,毕竟磁带不同于数字存储单元,它在批量化的视频录制中表现出很大的优势.下面,小编跟大 ...

  9. unity, 保存prefab时material丢失问题

    在程序运行时用replacePrefab(gameObj,prefab)或createPrefab(gameObj,prefab)保存prefab,遇到保存出来的prefab中material丢失的问 ...

  10. web前端-面试经验总结

    这几次面试主要是冲着百度去的 面试1的主要问题: 笔试: 1.解释css盒子模型 2.常用选择器,以及优先级 3.B如何继承A 4.写一个闭包实例,有什么优点缺点 5.html5的心特性有哪些 6. ...