数据库实验应该是智科人在大三上最重要的一个实验,也是非常考验自己创新能力的一个实验,需要用到自己前面自己学的语言与后台数据库连接(这里提供C#的连接和写法),有些同学刚刚开始学这门课就开始做数据库,毕竟实验时间比较紧张,学有余力可以学期开始就可以着手去设计自己的界面,设计是没有上限的,很利于培养工程能力。
这里提供验收时候老师会检查的一些东西:如何限制数据库的元素为唯一、特殊等等(答案是在sql server里面改),老师还会把你设计的数据库中输入的数字弄成负的(比如物品数量),告诉你这样不合理,怎么改,也是改SQL server里面的限制,尽可能所有问题从后台数据库去改,基本老师不会问你前面界面设计的问题。。。。。。
还有智科人没有软件工程这个课,其他专业有,他们数据库完成还需要完成软件工程相关的数据库搭建。
我把我在VS code设计的C#页面、后台SQL server设计的数据和整体框架都打包放在一个文件夹中(资料区下载)
文件名称:数据库实验所有程序(验优)
文件内容如下:
从上到下依次是VS的界面程序、sql server的恢复文件、一些恢复方法、踩坑记录。
废话少说,报告开冲:
先看具体要求:
我做的是超市销售系统,把所有的报告要求全部完成(每完成一小块会有个打钩,按完成度给分)
create view buy_dingdan(bno,pname,gname,bmoney,bnumber,btime) as
select bno,pname,gname,bmoney,bnumber,btime
from buy,good
where buy.gno=good.gno
(3)触发器
本来定义了两个触发器
(1)
create trigger kucun on buy
after insert as
begin
update good
set good.gamount=good.gamount-inserted.bnumber
from inserted
where good.gno=inserted.gno
End
(2)
create trigger shanchu on per
for delete
as
begin
delete buy where buy.pname in(select pname from deleted)
print('历史订单表也删除此销售员信息!')
end
第一个触发器的作用是每当销售员结账完毕,buy表中插入订单流水时候,就会触发good表,减少good表相应的商品库存,更加接近现实,已经成功,满足了需求分析里面的库存减少需求。
第二个触发器我本来是没有知道级联删除的设置在哪,想通过设置per表的销售员pname一删除就触发删除buy表中的对应订单,结果失败了,上网查了一下原来是因为:
触发器的执行是
1。执行前触发器
2。进行数据合法性,一致性,完整性检查,如果不能通过,就报错并回滚
3。数据真正作用在数据库中
4。执行相应触发器
所以第二个触发器优先级在外键之后,于是取消了这个触发器,后来找到了级联删除的设置面板。
(2)b站学会的定义dao类方法调用数据库,减少代码量(这里把{}去掉,增加写报告的空间)
class dao //定义这个类,下面是方法和属性
SqlConnection sc;
public SqlConnection connect()
//数据库连接字符串
sc = new SqlConnection("Integrated Security = SSPI; Persist Security Info = False; Initial Catalog = 超市销售管理系统; Data Source =.");//创建数据库连接对象
sc.Open();//打开数据库
return sc;//返回数据库连接对象
public SqlCommand command(string sql)
SqlCommand cmd = new SqlCommand(sql, connect());
return cmd;//返回对象
public int Execute(string sql)//更新操作
return command(sql).ExecuteNonQuery(); //执行SQL语句并返回受影响行数
public SqlDataReader read(string sql) //读取操作
return command(sql).ExecuteReader();
public void DaoClose()
sc.Close();//关闭数据库连接
利用if搞定老板和销售员直接登录的区别
if (Convert.ToDouble(dc["plb1"]) == 1)
MessageBox.Show("登录成功");
boss1 user = new boss1(); //实例化
this.Hide(); //隐藏旧窗体
user.ShowDialog(); //show和showDialog的区别是对话框
this.Show();
Regex regex1 = new Regex("^\\d{11}$"); //手机号码十一位的正则表达式
注册成功时候的调用
dao dao = new dao();
string sql = $"insert into per values({textBox1.Text},{textBox2.Text},'{textBox3.Text}',{maskedTextBox1.Text},'{k}',{x})";
int n = dao.Execute(sql); //n是受影响的行数
if (n > 0)
{
MessageBox.Show("注册成功");
this.Close();
}
dao.DaoClose();
实时时间的实现(去掉了{})
private void timer1_Tick(object sender, EventArgs e)
label7.Text= DateTime.Now.ToString("yyyy年MM月dd日hh时mm分ss秒");
合并查询的实现
dataGridView1.Rows.Clear(); //清空旧数据
dao dao = new dao();
string sql = $"select * from good where gno='{textBox1.Text}'or gname like'%{textBox1.Text}%' "; //我一开始分开,现在想改成合并查询
IDataReader dc = dao.read(sql);
while (dc.Read())
{
dataGridView1.Rows.Add(dc[0].ToString(), dc[1].ToString(), dc[2].ToString(), dc[3].ToString(), dc[4].ToString());
}
dc.Close();
dao.DaoClose();
删除商品的实现
DialogResult dr = MessageBox.Show("确认删除该商品吗?","信息提示",MessageBoxButtons.OKCancel, MessageBoxIcon.Question);
if(dr== DialogResult.OK)
string sql = $"delete from good where gno='{gno}'";
dao dao = new dao();
if (dao.Execute(sql)> 0) //受影响行数
MessageBox.Show("删除成功");
修改商品时候的传值调用(另一个窗口收到值)
try
{
string gno = dataGridView1.SelectedRows[0].Cells[0].Value.ToString();
string gname = dataGridView1.SelectedRows[0].Cells[1].Value.ToString();
string gprice = dataGridView1.SelectedRows[0].Cells[2].Value.ToString();
string bprice = dataGridView1.SelectedRows[0].Cells[3].Value.ToString();
string gamount = dataGridView1.SelectedRows[0].Cells[4].Value.ToString();
boss22 admin = new boss22(gno,gname,gprice,bprice,gamount);
admin.ShowDialog();
Table(); //刷新数据
}
catch
{
MessageBox.Show("出错了,请检查商品名称和编号,不能和已有的相同");
}
......
public boss22(string gno, string gname, string gprice, string bprice, string gamount)
刷新功能实现
foreach (Control ctr in Controls) //遍历控件,清空文本
{
if (ctr is TextBox) //找到TextBox控件
((TextBox)ctr).Text = string.Empty; //清空TextBox控件的文本内容
}
修改商品实现
string sql = $"update good set gno='{textBox1.Text}',[gname]='{textBox2.Text}',gprice={textBox3.Text},bprice={textBox4.Text},gamount={textBox5.Text}where gno='{Gno}'";
dao dao = new dao();
if (dao.Execute(sql) > 0)
MessageBox.Show("修改成功");
this.Close();
定义公用类,返回状态栏中的登录状态,同时,int那个用来返回结账页面表行数,方便使用for循环来把已经结账的流水循环插入订单buy表中
class Data
{ //利用后面调用
public static string UID = "", UName = ""; //登录用户的用户名和姓名
public static int count,t;//结账页面总行数,和第一行的第一个自增
}
视图查询中实现多条件查询
dataGridView1.Rows.Clear(); //清空旧数据
string sql = "1"; //对它赋空值
if (textBox1.Text != "" && textBox2.Text == "" && textBox3.Text == "")
sql = $"select * from buy_dingdan where pname like '%{textBox1.Text}%'or gname like'%{textBox1.Text}%' ";
else if (textBox1.Text == "" && textBox2.Text != "" && textBox3.Text != "")
sql = $"select * from buy_dingdan where (bmoney>='{textBox2.Text}') and (bmoney<='{textBox3.Text}')";
else if (textBox1.Text != "" && textBox2.Text != "" && textBox3.Text != "")
sql = $"select * from buy_dingdan where pname like '%{textBox1.Text}%'or gname like'%{textBox1.Text}%' and (bmoney >= '{textBox2.Text}') and(bmoney <= '{textBox3.Text}') ";
if (sql != "1")
dao dao = new dao();
IDataReader dc = dao.read(sql);
while (dc.Read()) //读到就循环,且Read()跳下一条
dataGridView1.Rows.Add(dc[0].ToString(), dc[1].ToString(), dc[2].ToString(), dc[3].ToString(), dc[4].ToString(), dc[5].ToString());
dc.Close();
dao.DaoClose();
结账成功(支付成功)后,还原清空kong表这个临时表,方便下次结账
while (dc.Read())
{
sql = $"insert into buy values('{Data.UName}','{dc[1].ToString()}','{dc[5].ToString()}',{Convert.ToInt16(dc[4].ToString())}, getdate())";
}
dao.Execute("Delete from kong where 1=1");
dao.DaoClose();
MessageBox.Show("恭喜你,支付成功!!");
this.Close();
三、课程设计(综合实验)总结或结论
略
四、同学间相互协作情况
借了隔壁宿舍一本书,是《c#从入门到精通》
五、参考文献
[1] 王珊,萨师煊. 《数据库系统概论》.高等教育出版社,第5版.2014年9月
[2] 明日科技. 《C#从入门到精通》.清华大学出版社,第6版.2020年5月
笔者介绍:某智科卑微牛马,一项省级大创已结项,一项国家级大创和一项校级大创已成功立项,都交给小自己一届的学弟去做,参加的挑战杯项目在其余队友参加大创后也获得了省级优秀和国家级优秀结项。同时组织并担任了2022年挑战杯、两项互联网+、电子商务大赛、舞蹈机器人大赛、“创青春”青年创新创业大赛的队长,并参加过节能减排大赛、调研河北大赛、数学建模美赛、蓝桥杯省赛、机器人国赛等比赛若干,获得过舞蹈机器人一等、电子商务大赛二等、挑战杯三等、节能减排省一等、创新创业优秀个人、社会实践优秀个人等奖项。
程序下载说明:作者所有的实验、课设验收基本都是优,也不缺这几米,不过不想自己的文章或者作品烂大街,想留点门槛,应该是几米这样子,作品都是保证高质量的,给有需要的学弟学妹们学习,大部分还是免费的,因为一些大型的文件不好上传,故放在付费资料区下载,真的非常良心!!