ado.not--综合练习
题目:
第一部分:
新建一个数据库: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表数据,并提示删除成功,继续回到“二”等待用户继续操作。
数据库:
1 create database adocc--创建数据库,名为adocc 2 go 3 use adocc 4 go 5 6 create table sub--专业表 7 ( 8 subcode nvarchar(20) primary key,--专业编号,主键 9 subjectname nvarchar (20)--专业名称 10 ) 11 insert into sub values('z001','商务英语') 12 insert into sub values('z002','软件工程') 13 insert into sub values('z003','旅游') 14 insert into sub values('z004','工商管理') 15 16 17 18 create table student--学生表 19 ( 20 code nvarchar(10) primary key,--学生编号,主键,为了确定唯一性 21 name nvarchar(20),--学生姓名 22 sex bit,--学生性别,bool类型,返回true或false 23 birthday datetime,--生日 24 subjectcode nvarchar(20)--专业编号,专业表的外键 25 ) 26 insert into student values('s001','张三','true','1994-1-12','z001') 27 insert into student values('s002','李四','true','1995-2-22','z002') 28 insert into student values('s003','王五','true','1996-8-28','z003') 29 insert into student values('s004','小花','false','1997-3-6','z004')
控制台应用程序:
数据库模型类:
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Data.SqlClient; 6 namespace ADO.Net测试.数据模型 7 { 8 public class student//数据库模型类,用来查询打印数据库表中信息使用泛型集合时,调用此类的方法添加集合项 9 { 10 private string _code; 11 12 public string code 13 { 14 get { return _code; } 15 set { _code = value; } 16 } 17 private string _name; 18 19 public string name 20 { 21 get { return _name; } 22 set { _name = value; } 23 } 24 private bool _sex; 25 26 public bool sex 27 { 28 get { return _sex; } 29 set { _sex = value; } 30 } 31 public string ssex 32 { 33 get {return (bool)_sex?"男":"女"; } 34 } 35 36 private DateTime _birthday; 37 38 public DateTime birthday 39 { 40 get { return _birthday; } 41 set { _birthday = value; } 42 } 43 public string birth 44 { 45 get { return _birthday.ToString("yyyy年MM月dd日"); }//此处是将生日改为字符串显示 46 } 47 //获取当前时间,根据生日日期算出年龄 48 public int age 49 { 50 get { return DateTime.Now.Year -((DateTime)_birthday).Year; } 51 } 52 private string _subjectcode; 53 54 public string subjectcode 55 { 56 get { return _subjectcode; } 57 set { _subjectcode = value; } 58 } 59 60 61 public string subb //将课程编号换成课程名字显示,需要通过外键表中的编号在主键表中查出名字 62 { 63 get 64 { 65 string f = ""; 66 SqlConnection conn = new SqlConnection("server=.;database=adocc;user=sa;pwd=123;"); 67 SqlCommand cmd = conn.CreateCommand(); 68 cmd.CommandText = "select *from sub where subcode=@sub"; 69 cmd.Parameters.Clear(); 70 cmd.Parameters.Add("@sub", _subjectcode); 71 conn.Open(); 72 SqlDataReader dr = cmd.ExecuteReader(); 73 if (dr.HasRows) 74 { 75 while(dr.Read()) 76 { 77 f = dr["subjectname"].ToString(); 78 } 79 } 80 conn.Close(); 81 return f; 82 } 83 } 84 } 85 }
数据库访问类:
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Data.SqlClient; 6 using ADO.Net测试.数据模型;//调用数据库模型类 7 8 namespace ADO.Net测试.数据库访问类 9 { 10 public class datastudent 11 { 12 SqlConnection conn = null;//数据库连接及操作 13 SqlCommand cmd = null; 14 15 public datastudent() 16 { 17 conn = new SqlConnection("server=.;database=adocc;user=sa;pwd=123;"); 18 cmd = conn.CreateCommand(); 19 } 20 21 //数据库表格进行查询打印,将所有数据放进泛型集合 22 public List<student> chaxun() 23 { 24 List<student> ls = new List<student>(); 25 cmd.CommandText = "select * from student"; 26 conn.Open(); 27 SqlDataReader dr = cmd.ExecuteReader(); 28 if (dr.HasRows) 29 { 30 while (dr.Read()) 31 { 32 student st = new student(); 33 st.code = dr["code"].ToString(); 34 st.name = dr["name"].ToString(); 35 st.sex = Convert.ToBoolean(dr["sex"]); 36 st.birthday = Convert.ToDateTime(dr["birthday"]); 37 st.subjectcode = dr["subjectcode"].ToString(); 38 ls.Add(st); 39 } 40 } 41 conn.Close(); 42 return ls; 43 } 44 45 public void dayin()//进行遍历集合,打印 46 { 47 List<student> su = new datastudent().chaxun(); 48 foreach (student dd in su) 49 { 50 Console.WriteLine(dd.code + "\t" + dd.name + "\t" + dd.ssex + "\t" + dd.age + "\t" + dd.birth + "\t" + dd.subb); 51 } 52 } 53 54 55 /// <summary> 56 /// bool判断 57 /// </summary> 58 /// <param name="aa"></param> 59 /// <returns></returns> 60 public bool zengjia(string aa)//学生编号输入增加判断 61 { 62 63 cmd.CommandText = "select * from student where code=@code"; 64 cmd.Parameters.Clear(); 65 cmd.Parameters.Add("@code",aa); 66 conn.Open(); 67 SqlDataReader dr = cmd.ExecuteReader(); 68 bool pd = false; 69 if (dr.HasRows) 70 { 71 pd = true; 72 } 73 conn.Close(); 74 return pd; 75 } 76 /// <summary> 77 /// 执行数据库添加 78 /// </summary> 79 /// <param name="bh">编号</param> 80 /// <param name="na">名字</param> 81 /// <param name="xb">性别</param> 82 /// <param name="birth">生日</param> 83 /// <param name="zy">专业</param> 84 public void tj(string bh, string na, bool xb, DateTime birth, string zy) 85 { 86 cmd.CommandText = "insert into student values(@bh,@na,@xb,@birth,@zy)"; 87 cmd.Parameters.Clear(); 88 cmd.Parameters.Add("@bh",bh); 89 cmd.Parameters.Add("@na",na); 90 cmd.Parameters.Add("@xb",xb); 91 cmd.Parameters.Add("@birth",birth); 92 cmd.Parameters.Add("@zy",zy); 93 conn.Open(); 94 cmd.ExecuteNonQuery(); 95 96 conn.Close(); 97 } 98 99 public bool coxg(string bb) //数据库修改、删除编号判断 100 { 101 cmd.CommandText = "select * from student where code=@code"; 102 cmd.Parameters.Clear(); 103 cmd.Parameters.Add("@code", bb); 104 conn.Open(); 105 SqlDataReader dr = cmd.ExecuteReader(); 106 bool pd = false; 107 if (dr.HasRows) 108 { 109 pd = true; 110 } 111 conn.Close(); 112 return pd; 113 } 114 public string naxg(string cc) //数据库修改,姓名查询 115 { 116 cmd.CommandText = "select * from student where code=@code"; 117 cmd.Parameters.Clear(); 118 cmd.Parameters.Add("@code", cc); 119 conn.Open(); 120 SqlDataReader dr = cmd.ExecuteReader(); 121 string mingzi = ""; 122 if (dr.HasRows) 123 { 124 dr.Read(); 125 mingzi = dr["name"].ToString(); 126 } 127 conn.Close(); 128 return mingzi; 129 } 130 131 public string xbxg(string dd) //数据库修改,性别查询 132 { 133 cmd.CommandText = "select * from student where code=@code"; 134 cmd.Parameters.Clear(); 135 cmd.Parameters.Add("@code", dd); 136 conn.Open(); 137 SqlDataReader dr = cmd.ExecuteReader(); 138 string xingbie = ""; 139 if (dr.HasRows) 140 { 141 dr.Read(); 142 xingbie = ((bool)dr["sex"]?"男":"女").ToString(); 143 } 144 conn.Close(); 145 return xingbie; 146 } 147 148 public DateTime birxg(string dd) //数据库修改,生日查询 149 { 150 cmd.CommandText = "select * from student where code=@code"; 151 cmd.Parameters.Clear(); 152 cmd.Parameters.Add("@code", dd); 153 conn.Open(); 154 SqlDataReader dr = cmd.ExecuteReader(); 155 DateTime shengri = new DateTime(); 156 if (dr.HasRows) 157 { 158 dr.Read(); 159 shengri = Convert.ToDateTime(dr["birthday"]); 160 } 161 conn.Close(); 162 return shengri; 163 } 164 165 public string zhuanye(string dd) //数据库修改,专业查询 166 { 167 cmd.CommandText = "select * from sub where subcode=(select subjectcode from student where code=@code)"; 168 cmd.Parameters.Clear(); 169 cmd.Parameters.Add("@code", dd); 170 conn.Open(); 171 SqlDataReader dr = cmd.ExecuteReader(); 172 string ka = ""; 173 if (dr.HasRows) 174 { 175 dr.Read(); 176 ka = dr["subjectname"].ToString(); 177 } 178 conn.Close(); 179 return ka; 180 } 181 /// <summary> 182 /// 数据库执行修改 183 /// </summary> 184 /// <param name="bh">学号</param> 185 /// <param name="na">姓名</param> 186 /// <param name="xb">性别</param> 187 /// <param name="birth">生日</param> 188 /// <param name="zy">专业</param> 189 public void xg(string bh, string na, bool xb, DateTime birth, string zy) 190 { 191 cmd.CommandText = "update student set name=@name,sex=@sex,birthday=@birth,subjectcode=@sub where code=@code"; 192 cmd.Parameters.Clear(); 193 cmd.Parameters.Add("@code", bh); 194 cmd.Parameters.Add("@name", na); 195 cmd.Parameters.Add("@sex", xb); 196 cmd.Parameters.Add("@birth", birth); 197 cmd.Parameters.Add("@sub", zy); 198 conn.Open(); 199 cmd.ExecuteNonQuery(); 200 201 conn.Close(); 202 } 203 204 205 public List<student> scxs(string cs)//进行输入要删除的学生编号后,进行此学生信息显示 206 { 207 List<student> ls = new List<student>(); 208 cmd.CommandText = "select * from student where code=@code"; 209 cmd.Parameters.Clear(); 210 cmd.Parameters.Add("@code",cs); 211 conn.Open(); 212 SqlDataReader dr = cmd.ExecuteReader(); 213 if (dr.HasRows) 214 { 215 dr.Read(); 216 { 217 student st = new student(); 218 st.code = dr["code"].ToString(); 219 st.name = dr["name"].ToString(); 220 st.sex = Convert.ToBoolean(dr["sex"]); 221 st.birthday = Convert.ToDateTime(dr["birthday"]); 222 st.subjectcode = dr["subjectcode"].ToString(); 223 ls.Add(st); 224 } 225 } 226 conn.Close(); 227 return ls; 228 } 229 230 public void dy(string bb)//进行遍历集合,打印 231 { 232 string zx=bb; 233 List<student> su = new datastudent().scxs(zx); 234 foreach (student dd in su) 235 { 236 Console.WriteLine(dd.code + "\t" + dd.name + "\t" + dd.ssex + "\t" + dd.age + "\t" + dd.birth + "\t" + dd.subb); 237 } 238 } 239 240 241 242 /// <summary> 243 /// 执行删除 244 /// </summary> 245 /// <param name="delete"></param> 246 public void sc(string delete) 247 { 248 cmd.CommandText = "delete from student where code=@code"; 249 cmd.Parameters.Clear(); 250 cmd.Parameters.Add("@code",delete); 251 conn.Open(); 252 cmd.ExecuteNonQuery(); 253 conn.Close(); 254 } 255 256 } 257 }
program类:
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using ADO.Net测试.数据库访问类;//引用类 6 using ADO.Net测试.数据模型;//引用类 7 using System.Data.SqlClient;//引用数据库 8 namespace ADO.Net测试 9 { 10 class Program 11 { 12 static void Main(string[] args) 13 { 14 datastudent table = new datastudent();//先实例化数据访问类 15 table.dayin();//调用里面的对象方法,这一步是显示数据库表的内容 16 for (; ; )//输入错误时循环回到顶部重新输入 17 { 18 Console.Write("请输入继续的操作指令(1.新增,2.修改,3.删除):");//根据指令输入自己的操作 19 string cz = Console.ReadLine(); 20 if (cz == "1" || cz == "2" || cz == "3")//如果输入的是正确的指令,将走下一步操作 21 { 22 if (cz == "1")//同样是判断输入的正确才往下走 23 { 24 //输入完成打印的时候引用的数据库访问类里的方法,有参数,需要把变量定义在外面,以便返回参数 25 string bh = ""; string na = ""; string xb = ""; DateTime birth = new DateTime(); string zy = ""; 26 for (; ; )//这个循环是在输入完成是否执行时使用,不执行返回重新输入 27 { 28 for (; ; )//此处是输入错误式返回重新输入 29 { 30 31 Console.Write("请输入新增学生编号:"); 32 bh = Console.ReadLine(); 33 bool pd = new datastudent().zengjia(bh);//实例化数据库访问类里面的方法 34 if (pd == false) { break; } 35 else { Console.WriteLine("已有此学号,请重新输入!"); } 36 } 37 for (; ; )//此处是输入错误式返回重新输入 38 { 39 Console.Write("请输入新增学生姓名:"); 40 na = Console.ReadLine(); 41 if (na != "") { break; } 42 else { Console.WriteLine("姓名不能为空,请重新输入!"); } 43 } 44 bool bl;//数据库中的性别是bool类型,需要定义bool变量,输入男女改为bool类型,以便数据库查询 45 for (; ; ) 46 { 47 Console.Write("请输入学生性别:"); 48 xb = Console.ReadLine(); 49 if (xb == "男") { bl = true; break; } 50 else if (xb == "女") { bl = false; break; } 51 else { Console.WriteLine("您的输入有误,请重新输入!"); } 52 } 53 54 55 for (; ; ) 56 { 57 try 58 { 59 Console.Write("请输入学生生日:");//datetime类型,try一下输入是否有误 60 birth = Convert.ToDateTime(Console.ReadLine()); 61 break; 62 } 63 catch 64 { 65 Console.WriteLine("输入有误,请重新输入!"); 66 } 67 } 68 string ka = ""; 69 for (; ; ) 70 { 71 Console.Write("请输入学生专业:"); 72 zy = Console.ReadLine(); 73 SqlConnection conn = new SqlConnection("server=.;database=adocc;user=sa;pwd=123;"); 74 SqlCommand cmd = conn.CreateCommand(); 75 cmd.CommandText = "select *from sub where subjectname = @name"; 76 cmd.Parameters.Clear(); 77 cmd.Parameters.Add("@name", zy); 78 conn.Open(); 79 SqlDataReader dr = cmd.ExecuteReader(); 80 if (dr.HasRows)//开数据库查询是否有输入的信息,输入的是课程名字,需要到专业课表中查询, 81 { //学生表中的专业课是课程表中编号的外键,只有把名字变为编号才可以在学生表中查询 82 dr.Read(); 83 ka = dr["subcode"].ToString();//需要定义一个变量将通过名字在课程表中查询到的信息中的编号接收 84 conn.Close(); 85 break; 86 } 87 else { Console.WriteLine("您的输入有误,请重新输入"); conn.Close(); } 88 } 89 90 Console.WriteLine("学号:" + bh + " 姓名: " + na + " 性别: " + xb + " 生日: " + birth + " 专业: " + zy); 91 Console.Write("以上为新增学生信息,是否确定添加?确定输入Y: "); 92 string y = Console.ReadLine(); 93 if (y == "Y")//判断输入确定指令才执行 94 { 95 Console.Clear();//刷新打印 96 datastudent dt = new datastudent();//实例化 97 dt.tj(bh, na, bl, birth, ka);//在数据库访问类里将添加方法建立了一个对象,直接返回参数调用 98 dt.dayin();//数据库访问类里面有一个打印表的对象方法,直接调用 99 break; 100 } 101 else { }//如果输入的不是确定指令,则回到此循环顶部重新输入 102 } 103 } 104 105 else if (cz == "2")//根据输入指令操作,与上面添加一个原理,调用的方法都在数据库访问类 106 { 107 string bh = ""; string na = ""; string xb = ""; DateTime birth = new DateTime(); string zy = ""; 108 for (; ; ) 109 { 110 for (; ; ) 111 { 112 113 Console.Write("请输入修改学生编号:"); 114 bh = Console.ReadLine(); 115 bool pd = new datastudent().coxg(bh); 116 if (pd == true) 117 { 118 Console.WriteLine("已查询到" + bh + "的学生信息,请进行以下修改:"); 119 break; 120 } 121 else { Console.WriteLine("没有查询到此学号的学生,请重新输入!"); } 122 } 123 for (; ; ) 124 { 125 string nna = new datastudent().naxg(bh); 126 Console.WriteLine(bh + "学生当前姓名为" + nna); 127 Console.Write("请输入您的修改:"); 128 na = Console.ReadLine(); 129 if (na != "") 130 { 131 break; 132 } 133 else { Console.WriteLine("输入不能为空,请重新输入!"); } 134 } 135 136 bool b2; 137 for (; ; ) 138 { 139 string nn = new datastudent().xbxg(bh); 140 Console.WriteLine(bh + "学生当前的性别为" + nn); 141 Console.Write("请输入您的修改:"); 142 xb = Console.ReadLine(); 143 if (xb == "男") { b2 = true; break; } 144 else if (xb == "女") { b2 = false; break; } 145 else { Console.WriteLine("您的输入有误,请重新输入!"); } 146 } 147 148 for (; ; ) 149 { 150 DateTime sr = new datastudent().birxg(bh); 151 Console.WriteLine(bh + "学生当前的生日为:" + sr); 152 try 153 { 154 Console.Write("请输入您的修改:"); 155 birth = Convert.ToDateTime(Console.ReadLine()); 156 break; 157 } 158 catch 159 { 160 Console.WriteLine("输入有误,请重新输入!"); 161 } 162 } 163 164 string ka = ""; 165 166 for (; ; ) 167 { 168 string zyy = new datastudent().zhuanye(bh); 169 Console.WriteLine(bh + "学生当前的专业为:" + zyy); 170 Console.Write("请输入您的修改:"); 171 zy = Console.ReadLine(); 172 SqlConnection conn = new SqlConnection("server=.;database=adocc;user=sa;pwd=123;"); 173 SqlCommand cmd = conn.CreateCommand(); 174 cmd.CommandText = "select *from sub where subjectname = @name"; 175 cmd.Parameters.Clear(); 176 cmd.Parameters.Add("@name", zy); 177 conn.Open(); 178 SqlDataReader dr = cmd.ExecuteReader(); 179 if (dr.HasRows) 180 { 181 dr.Read(); 182 ka = dr["subcode"].ToString(); 183 conn.Close(); 184 break; 185 } 186 else { Console.WriteLine("您的输入有误,请重新输入"); conn.Close(); } 187 } 188 //输入完以后先将此条信息打印一下,可以开数据库将此信息查询打印,此处直接打印,在删除方法中用了数据库打印 189 Console.WriteLine("学号:" + bh + " 姓名: " + na + " 性别: " + xb + " 生日: " + birth + " 专业: " + zy); 190 Console.Write("以上为新增学生信息,是否确定添加?确定输入Y: "); 191 string y = Console.ReadLine(); 192 if (y == "Y") 193 { 194 Console.Clear(); 195 datastudent dt = new datastudent(); 196 dt.xg(bh, na, b2, birth, ka); 197 dt.dayin(); 198 break; 199 } 200 else { } 201 } 202 } 203 else if (cz == "3") 204 { 205 string bh = ""; 206 for (; ; ) 207 { 208 for (; ; ) 209 { 210 211 Console.Write("请输入删除的学生编号:"); 212 bh = Console.ReadLine(); 213 bool pd = new datastudent().coxg(bh); 214 if (pd == true) 215 { 216 break; 217 } 218 else { Console.WriteLine("没有查询到此学号的学生,请重新输入!"); } 219 } 220 221 datastudent dat = new datastudent(); 222 dat.dy(bh); 223 Console.Write("以上为根据您的输入查询到的学生信息,是否确定删除?确定输入Y: "); 224 string y = Console.ReadLine(); 225 if (y == "Y") 226 { 227 Console.Clear(); 228 dat.sc(bh); 229 Console.WriteLine("删除成功!"); 230 dat.dayin(); 231 break; 232 } 233 else { } 234 } 235 236 } 237 238 } 239 else//如果操作指令输入有误,将循环返回顶部重新输入 240 { 241 Console.WriteLine("输入错误,请重新输入!"); 242 } 243 } 244 245 246 Console.ReadKey(); 247 } 248 } 249 }
效果显示: