一、完整修改和查询

在编写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. js获取ifram对象

    1.获取iframe对象 var doc=document.getElementById('frameId').contentWindow.document; //var doc=parent.doc ...

  2. phpstorm编辑器智能提示框架代码

    按照上面的步骤就可以智能提示代码了!

  3. JQuery高性能最佳实践

    [使用最佳选择器] 使用JQuery时,你可以使用多种选择器,选择同一个元素,各种方法之间的性能是不一样的,有时候差异会特别大. 通常比较常用的选择器有以下几个: ID选择器 $("#id& ...

  4. 微信网页授权获取用户基本信息--PHP

    现在就说说怎么通过网页授权获取用户基本信息(国家,省,市,昵称)等. 必要条件: 1)公众号认证 2)有网页授权获取用户基本信息的权限接口 注意:最近有朋友说:在公众平台申请的测试号,会出现无法取到用 ...

  5. 认识js函数对象(Function Object)

    认识函数对象(Function Object) 可以用function关键字定义一个函数,对于每个函数可以为其指定一个函数名,通过函 数名来进行调用.这些都是代码给用户的印象,而在JavaScript ...

  6. 关于android中EditText边框的问题 下划线

    方法1 将edittext的style设置成?android:attr/textViewStyle 取消掉默认的样式,在设置background为@null 接下来就是一个空空的edittext了, ...

  7. hadoop spark学习笔记

    http://www.csdn.net/article/2015-06-08/2824889 hive:是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供简单的sq ...

  8. kettle常见问题解决

    开源ETL工具kettle系列之常见问题 摘要:本文主要介绍使用kettle设计一些ETL任务时一些常见问题,这些问题大部分都不在官方FAQ上,你可以在kettle的论坛上找到一些问题的答案 1. J ...

  9. azure 云上MySQL最新版本 MySQL5.7.11 批量自动化一键式安装 (转)

    --背景云端 以前都喜欢了源码安装mysql,总觉得源码是高大上的事情,不过源码也需要时间,特别是make的时候,如果磁盘和cpu差的话,时间很长很长,在虚拟机上安装mysql尤其甚慢了. 现在业务发 ...

  10. css3 文字闪动效果

    <div id="container"> 这里查看“<span class="blink">闪烁效果</span>”,ENj ...