ADO.net 综合练习题
题目:
第一部分:
新建一个数据库:ADO测试,包含下面两个数据表,使用代码创建,并保留创建的代码文本。
专业表Subject:
专业编号(SubjectCode):nvarchar类型,不能为空,主键
专业名称(SubjectName):nvarchar类型,不能为空
学生表Student:
编号(Code):nvarchar类型,不能为空,主键
姓名(Name):nvarchar类型,不能为空
性别(Sex):bit类型,不能为空,true为男,false为女
生日(Birthday):datetime类型,不能为空
专业编号(SubjectCode):nvarchar类型,专业表的外键
第二部分:
新建一个控制台应用程序:
一、数据显示:
将Student表数据查询显示,显示格式为:
编号 姓名 性别 年龄 生日 专业
001 张三 男 22 1994年1月12日 商务英语
……
……
性别显示为男/女(true为男,false为女),自动计算出年龄,生日显示为“XXXX年XX月XX日”,专业显示专业编号对应的专业名称。
二、功能操作:
在上面的基础上增加功能,表数据显示完毕后,提示用户可以继续操作:
“请输入您要继续的操作(输入数字1为新增,输入数字2为修改,输入数字3为删除):”,输入其它内容提示输入有误,并回到上面继续等待用户操作。
三、新增:
当用户输入1并回车后,按照顺序让用户分别输入:学生编号,学生姓名,性别,生日,专业等内容,格式为:
请输入学生编号:
请输入学生姓名(不能为空):
请输入学生性别(男/女):
请输入学生生日(如:2000/12/12):
请输入专业:
每次输入都需要做以下判断,如果输入不正确,则提示输入有误,并让用户重新输入,当每一项输入正确后才可以继续下一项的输入;
1、学生编号不允许重复
2、学生姓名不能为空
3、性别只能输入男/女,并自动转换为true/false
4、生日格式是否是正确
5、专业需要用户输入中文,如:当用户输入“商务英语”,自动查到“Z001”专业编号,如果查不到则提示“没有此专业,请重新输入。”
当以上内容全部填写完毕并无误后,将此学生信息打印显示出来,并询问用户“以上为新增学生的信息,是否确定添加?(Y/N):”,当用户输入Y确定添加后,才进行添加,如果添加成功,则将控制台程序清空,并刷新显示最新的Student表数据,在底部提示”添加成功”,并继续回到“第2步”等待用户继续操作。
四、修改:
当用户输入2并回车时,提示用户输入需要更改的学生编号,如果有此学生,那么除学生编号外,其余的内容全部进行修改,格式为:
已查询到S001的学生信息,请进行以下修改:
S001学生当前姓名为:张三
请输入您的修改:
S001学生当前的性别为:男
请输入您的修改:
……
每次修改后都需要与新增时一样的判断,当全部内容都修改完毕后,将修改后的学生信息打印显示出来,并询问“以上为修改后的学生信息,是否确定修改?(Y/N):”,当用户输入Y并回车才真正确定修改,并提示修改是否成功,如果修改成功,则清空控制台内容,刷新显示最新的Student表数据,并提示修改成功,继续回到“二”等待用户继续操作。
五、删除:
当用户输入3并回车时,提示用户输入需要删除的学生编号,如果有此学生,那么将此学生的信息展示出来,并提示“是否要删除此学生的信息?(Y/N)”,当用户输入Y确定删除后,才进行删除,并提示删除是否成功,如果删除成功,则清空控制台内容,刷新显示最新的Student表数据,并提示删除成功,继续回到“二”等待用户继续操作。
数据库:
create database adocc--创建数据库,名为adocc go use adocc go create table sub--专业表 ( subcode nvarchar(20) primary key,--专业编号,主键 subjectname nvarchar (20)--专业名称 ) insert into sub values('z001','商务英语') insert into sub values('z002','软件工程') insert into sub values('z003','旅游') insert into sub values('z004','工商管理') create table student--学生表 ( code nvarchar(10) primary key,--学生编号,主键,为了确定唯一性 name nvarchar(20),--学生姓名 sex bit,--学生性别,bool类型,返回true或false birthday datetime,--生日 subjectcode nvarchar(20)--专业编号,专业表的外键 ) insert into student values('s001','张三','true','1994-1-12','z001') insert into student values('s002','李四','true','1995-2-22','z002') insert into student values('s003','王五','true','1996-8-28','z003') insert into student values('s004','小花','false','1997-3-6','z004')
控制台应用程序:
数据库模型类:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Data.SqlClient; namespace ADO.Net测试.数据模型 { public class student//数据库模型类,用来查询打印数据库表中信息使用泛型集合时,调用此类的方法添加集合项 { private string _code; public string code { get { return _code; } set { _code = value; } } private string _name; public string name { get { return _name; } set { _name = value; } } private bool _sex; public bool sex { get { return _sex; } set { _sex = value; } } public string ssex { get {return (bool)_sex?"男":"女"; } } private DateTime _birthday; public DateTime birthday { get { return _birthday; } set { _birthday = value; } } public string birth { get { return _birthday.ToString("yyyy年MM月dd日"); }//此处是将生日改为字符串显示 } //获取当前时间,根据生日日期算出年龄 public int age { get { return DateTime.Now.Year -((DateTime)_birthday).Year; } } private string _subjectcode; public string subjectcode { get { return _subjectcode; } set { _subjectcode = value; } } public string subb //将课程编号换成课程名字显示,需要通过外键表中的编号在主键表中查出名字 { get { string f = ""; SqlConnection conn = new SqlConnection("server=.;database=adocc;user=sa;pwd=123;"); SqlCommand cmd = conn.CreateCommand(); cmd.CommandText = "select *from sub where subcode=@sub"; cmd.Parameters.Clear(); cmd.Parameters.Add("@sub", _subjectcode); conn.Open(); SqlDataReader dr = cmd.ExecuteReader(); if (dr.HasRows) { while(dr.Read()) { f = dr["subjectname"].ToString(); } } conn.Close(); return f; } } } }
数据库访问类:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Data.SqlClient; using ADO.Net测试.数据模型;//调用数据库模型类 namespace ADO.Net测试.数据库访问类 { public class datastudent { SqlConnection conn = null;//数据库连接及操作 SqlCommand cmd = null; public datastudent() { conn = new SqlConnection("server=.;database=adocc;user=sa;pwd=123;"); cmd = conn.CreateCommand(); } //数据库表格进行查询打印,将所有数据放进泛型集合 public List<student> chaxun() { List<student> ls = new List<student>(); cmd.CommandText = "select * from student"; conn.Open(); SqlDataReader dr = cmd.ExecuteReader(); if (dr.HasRows) { while (dr.Read()) { student st = new student(); st.code = dr["code"].ToString(); st.name = dr["name"].ToString(); st.sex = Convert.ToBoolean(dr["sex"]); st.birthday = Convert.ToDateTime(dr["birthday"]); st.subjectcode = dr["subjectcode"].ToString(); ls.Add(st); } } conn.Close(); return ls; } public void dayin()//进行遍历集合,打印 { List<student> su = new datastudent().chaxun(); foreach (student dd in su) { Console.WriteLine(dd.code + "\t" + dd.name + "\t" + dd.ssex + "\t" + dd.age + "\t" + dd.birth + "\t" + dd.subb); } } /// <summary> /// bool判断 /// </summary> /// <param name="aa"></param> /// <returns></returns> public bool zengjia(string aa)//学生编号输入增加判断 { cmd.CommandText = "select * from student where code=@code"; cmd.Parameters.Clear(); cmd.Parameters.Add("@code",aa); conn.Open(); SqlDataReader dr = cmd.ExecuteReader(); bool pd = false; if (dr.HasRows) { pd = true; } conn.Close(); return pd; } /// <summary> /// 执行数据库添加 /// </summary> /// <param name="bh">编号</param> /// <param name="na">名字</param> /// <param name="xb">性别</param> /// <param name="birth">生日</param> /// <param name="zy">专业</param> public void tj(string bh, string na, bool xb, DateTime birth, string zy) { cmd.CommandText = "insert into student values(@bh,@na,@xb,@birth,@zy)"; cmd.Parameters.Clear(); cmd.Parameters.Add("@bh",bh); cmd.Parameters.Add("@na",na); cmd.Parameters.Add("@xb",xb); cmd.Parameters.Add("@birth",birth); cmd.Parameters.Add("@zy",zy); conn.Open(); cmd.ExecuteNonQuery(); conn.Close(); } public bool coxg(string bb) //数据库修改、删除编号判断 { cmd.CommandText = "select * from student where code=@code"; cmd.Parameters.Clear(); cmd.Parameters.Add("@code", bb); conn.Open(); SqlDataReader dr = cmd.ExecuteReader(); bool pd = false; if (dr.HasRows) { pd = true; } conn.Close(); return pd; } public string naxg(string cc) //数据库修改,姓名查询 { cmd.CommandText = "select * from student where code=@code"; cmd.Parameters.Clear(); cmd.Parameters.Add("@code", cc); conn.Open(); SqlDataReader dr = cmd.ExecuteReader(); string mingzi = ""; if (dr.HasRows) { dr.Read(); mingzi = dr["name"].ToString(); } conn.Close(); return mingzi; } public string xbxg(string dd) //数据库修改,性别查询 { cmd.CommandText = "select * from student where code=@code"; cmd.Parameters.Clear(); cmd.Parameters.Add("@code", dd); conn.Open(); SqlDataReader dr = cmd.ExecuteReader(); string xingbie = ""; if (dr.HasRows) { dr.Read(); xingbie = ((bool)dr["sex"]?"男":"女").ToString(); } conn.Close(); return xingbie; } public DateTime birxg(string dd) //数据库修改,生日查询 { cmd.CommandText = "select * from student where code=@code"; cmd.Parameters.Clear(); cmd.Parameters.Add("@code", dd); conn.Open(); SqlDataReader dr = cmd.ExecuteReader(); DateTime shengri = new DateTime(); if (dr.HasRows) { dr.Read(); shengri = Convert.ToDateTime(dr["birthday"]); } conn.Close(); return shengri; } public string zhuanye(string dd) //数据库修改,专业查询 { cmd.CommandText = "select * from sub where subcode=(select subjectcode from student where code=@code)"; cmd.Parameters.Clear(); cmd.Parameters.Add("@code", dd); conn.Open(); SqlDataReader dr = cmd.ExecuteReader(); string ka = ""; if (dr.HasRows) { dr.Read(); ka = dr["subjectname"].ToString(); } conn.Close(); return ka; } /// <summary> /// 数据库执行修改 /// </summary> /// <param name="bh">学号</param> /// <param name="na">姓名</param> /// <param name="xb">性别</param> /// <param name="birth">生日</param> /// <param name="zy">专业</param> public void xg(string bh, string na, bool xb, DateTime birth, string zy) { cmd.CommandText = "update student set name=@name,sex=@sex,birthday=@birth,subjectcode=@sub where code=@code"; cmd.Parameters.Clear(); cmd.Parameters.Add("@code", bh); cmd.Parameters.Add("@name", na); cmd.Parameters.Add("@sex", xb); cmd.Parameters.Add("@birth", birth); cmd.Parameters.Add("@sub", zy); conn.Open(); cmd.ExecuteNonQuery(); conn.Close(); } public List<student> scxs(string cs)//进行输入要删除的学生编号后,进行此学生信息显示 { List<student> ls = new List<student>(); cmd.CommandText = "select * from student where code=@code"; cmd.Parameters.Clear(); cmd.Parameters.Add("@code",cs); conn.Open(); SqlDataReader dr = cmd.ExecuteReader(); if (dr.HasRows) { dr.Read(); { student st = new student(); st.code = dr["code"].ToString(); st.name = dr["name"].ToString(); st.sex = Convert.ToBoolean(dr["sex"]); st.birthday = Convert.ToDateTime(dr["birthday"]); st.subjectcode = dr["subjectcode"].ToString(); ls.Add(st); } } conn.Close(); return ls; } public void dy(string bb)//进行遍历集合,打印 { string zx=bb; List<student> su = new datastudent().scxs(zx); foreach (student dd in su) { Console.WriteLine(dd.code + "\t" + dd.name + "\t" + dd.ssex + "\t" + dd.age + "\t" + dd.birth + "\t" + dd.subb); } } /// <summary> /// 执行删除 /// </summary> /// <param name="delete"></param> public void sc(string delete) { cmd.CommandText = "delete from student where code=@code"; cmd.Parameters.Clear(); cmd.Parameters.Add("@code",delete); conn.Open(); cmd.ExecuteNonQuery(); conn.Close(); } } }
program类:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using ADO.Net测试.数据库访问类;//引用类 using ADO.Net测试.数据模型;//引用类 using System.Data.SqlClient;//引用数据库 namespace ADO.Net测试 { class Program { static void Main(string[] args) { datastudent table = new datastudent();//先实例化数据访问类 table.dayin();//调用里面的对象方法,这一步是显示数据库表的内容 for (; ; )//输入错误时循环回到顶部重新输入 { Console.Write("请输入继续的操作指令(1.新增,2.修改,3.删除):");//根据指令输入自己的操作 string cz = Console.ReadLine(); if (cz == "1" || cz == "2" || cz == "3")//如果输入的是正确的指令,将走下一步操作 { if (cz == "1")//同样是判断输入的正确才往下走 { //输入完成打印的时候引用的数据库访问类里的方法,有参数,需要把变量定义在外面,以便返回参数 string bh = ""; string na = ""; string xb = ""; DateTime birth = new DateTime(); string zy = ""; for (; ; )//这个循环是在输入完成是否执行时使用,不执行返回重新输入 { for (; ; )//此处是输入错误式返回重新输入 { Console.Write("请输入新增学生编号:"); bh = Console.ReadLine(); bool pd = new datastudent().zengjia(bh);//实例化数据库访问类里面的方法 if (pd == false) { break; } else { Console.WriteLine("已有此学号,请重新输入!"); } } for (; ; )//此处是输入错误式返回重新输入 { Console.Write("请输入新增学生姓名:"); na = Console.ReadLine(); if (na != "") { break; } else { Console.WriteLine("姓名不能为空,请重新输入!"); } } bool bl;//数据库中的性别是bool类型,需要定义bool变量,输入男女改为bool类型,以便数据库查询 for (; ; ) { Console.Write("请输入学生性别:"); xb = Console.ReadLine(); if (xb == "男") { bl = true; break; } else if (xb == "女") { bl = false; break; } else { Console.WriteLine("您的输入有误,请重新输入!"); } } for (; ; ) { try { Console.Write("请输入学生生日:");//datetime类型,try一下输入是否有误 birth = Convert.ToDateTime(Console.ReadLine()); break; } catch { Console.WriteLine("输入有误,请重新输入!"); } } string ka = ""; for (; ; ) { Console.Write("请输入学生专业:"); zy = Console.ReadLine(); SqlConnection conn = new SqlConnection("server=.;database=adocc;user=sa;pwd=123;"); SqlCommand cmd = conn.CreateCommand(); cmd.CommandText = "select *from sub where subjectname = @name"; cmd.Parameters.Clear(); cmd.Parameters.Add("@name", zy); conn.Open(); SqlDataReader dr = cmd.ExecuteReader(); if (dr.HasRows)//开数据库查询是否有输入的信息,输入的是课程名字,需要到专业课表中查询, { //学生表中的专业课是课程表中编号的外键,只有把名字变为编号才可以在学生表中查询 dr.Read(); ka = dr["subcode"].ToString();//需要定义一个变量将通过名字在课程表中查询到的信息中的编号接收 conn.Close(); break; } else { Console.WriteLine("您的输入有误,请重新输入"); conn.Close(); } } Console.WriteLine("学号:" + bh + " 姓名: " + na + " 性别: " + xb + " 生日: " + birth + " 专业: " + zy); Console.Write("以上为新增学生信息,是否确定添加?确定输入Y: "); string y = Console.ReadLine(); if (y == "Y")//判断输入确定指令才执行 { Console.Clear();//刷新打印 datastudent dt = new datastudent();//实例化 dt.tj(bh, na, bl, birth, ka);//在数据库访问类里将添加方法建立了一个对象,直接返回参数调用 dt.dayin();//数据库访问类里面有一个打印表的对象方法,直接调用 break; } else { }//如果输入的不是确定指令,则回到此循环顶部重新输入 } } else if (cz == "2")//根据输入指令操作,与上面添加一个原理,调用的方法都在数据库访问类 { string bh = ""; string na = ""; string xb = ""; DateTime birth = new DateTime(); string zy = ""; for (; ; ) { for (; ; ) { Console.Write("请输入修改学生编号:"); bh = Console.ReadLine(); bool pd = new datastudent().coxg(bh); if (pd == true) { Console.WriteLine("已查询到" + bh + "的学生信息,请进行以下修改:"); break; } else { Console.WriteLine("没有查询到此学号的学生,请重新输入!"); } } for (; ; ) { string nna = new datastudent().naxg(bh); Console.WriteLine(bh + "学生当前姓名为" + nna); Console.Write("请输入您的修改:"); na = Console.ReadLine(); if (na != "") { break; } else { Console.WriteLine("输入不能为空,请重新输入!"); } } bool b2; for (; ; ) { string nn = new datastudent().xbxg(bh); Console.WriteLine(bh + "学生当前的性别为" + nn); Console.Write("请输入您的修改:"); xb = Console.ReadLine(); if (xb == "男") { b2 = true; break; } else if (xb == "女") { b2 = false; break; } else { Console.WriteLine("您的输入有误,请重新输入!"); } } for (; ; ) { DateTime sr = new datastudent().birxg(bh); Console.WriteLine(bh + "学生当前的生日为:" + sr); try { Console.Write("请输入您的修改:"); birth = Convert.ToDateTime(Console.ReadLine()); break; } catch { Console.WriteLine("输入有误,请重新输入!"); } } string ka = ""; for (; ; ) { string zyy = new datastudent().zhuanye(bh); Console.WriteLine(bh + "学生当前的专业为:" + zyy); Console.Write("请输入您的修改:"); zy = Console.ReadLine(); SqlConnection conn = new SqlConnection("server=.;database=adocc;user=sa;pwd=123;"); SqlCommand cmd = conn.CreateCommand(); cmd.CommandText = "select *from sub where subjectname = @name"; cmd.Parameters.Clear(); cmd.Parameters.Add("@name", zy); conn.Open(); SqlDataReader dr = cmd.ExecuteReader(); if (dr.HasRows) { dr.Read(); ka = dr["subcode"].ToString(); conn.Close(); break; } else { Console.WriteLine("您的输入有误,请重新输入"); conn.Close(); } } //输入完以后先将此条信息打印一下,可以开数据库将此信息查询打印,此处直接打印,在删除方法中用了数据库打印 Console.WriteLine("学号:" + bh + " 姓名: " + na + " 性别: " + xb + " 生日: " + birth + " 专业: " + zy); Console.Write("以上为新增学生信息,是否确定添加?确定输入Y: "); string y = Console.ReadLine(); if (y == "Y") { Console.Clear(); datastudent dt = new datastudent(); dt.xg(bh, na, b2, birth, ka); dt.dayin(); break; } else { } } } else if (cz == "3") { string bh = ""; for (; ; ) { for (; ; ) { Console.Write("请输入删除的学生编号:"); bh = Console.ReadLine(); bool pd = new datastudent().coxg(bh); if (pd == true) { break; } else { Console.WriteLine("没有查询到此学号的学生,请重新输入!"); } } datastudent dat = new datastudent(); dat.dy(bh); Console.Write("以上为根据您的输入查询到的学生信息,是否确定删除?确定输入Y: "); string y = Console.ReadLine(); if (y == "Y") { Console.Clear(); dat.sc(bh); Console.WriteLine("删除成功!"); dat.dayin(); break; } else { } } } } else//如果操作指令输入有误,将循环返回顶部重新输入 { Console.WriteLine("输入错误,请重新输入!"); } } Console.ReadKey(); } } }
效果显示: