这个《学生信息管理系统》是按VC++课程设计要求用C#实现的一个小系统,实现功能虽然简单,只是涉及到数据的添加,修改,删除,统计等,但是在数据处理过程中遇到的一些问题和解决方法还是有必要小结一下的;
系统的数据库总共用了12张数据表,数据关系比较多,所以在处理过程中对数据库的了解更进一步了,其中一个问题是在数据添加过程中涉及到相关联表添加数据的问题,由于多个主外键的关系,不能直接使用C#代码进行添加,在这里我使用了存储过程,实现方法如下所示:
declare @nID int
insert into Tb1(....) values(...)
select @nID=@@identity
insert into Tb2(ParentID,...) values(@nID,...)
select @nID=@@identity
insert into Tb3(ParentID,...) values(@nID,...)
必须注意的一个问题就是要注意插入的顺序,比如说课程添加模块,必须先在课程信息表里各个外键关系的主键表中查询符合添加条件的记录:
select @gradeid=gradeid from gradeinfo where @gradename=gradename
select @xueyuanid=xueyuanid from xueyuaninfo where @xueyuanname=xueyuanname
select @majorid=majorid from majorinfo where @gradeid=gradeid and @xueyuanid=xueyuanid and @majorname=majorname
select @teachid=teachid from teacherinfo where @teachname=teachname
select @cstyleid=cstyleid from cstyleinfo where @cstylename=cstylename
select @yearid=yearid from yearinfo where @yearname=yearname
select @teamid=teamid from teaminfo where @teamname=teamname
然后根据检索出来符合条件的数据当做条件检索上一层的主键表,一直检索到课程信息表,然后用insert方法对所有数据进行添加:
insert into coursesinfo(cname,cnum,ctime,cintro,teachid,cstyleid,majorid,yearid,teamid,cpoint)
values (@cname,@cnum,@ctime,@cintro,@teachid,@cstyleid,@majorid,@yearid,@teamid,@cpoint)
当然,因为这个是学生信息管理,也就是说添加进去的记录是不能出现重复,除了可以用C#代码进行判断之外你还可以在储存过程中添加一天判断语句进行判断,如果出现重复的话就不能插入了:
select @count=count(coursesid)from coursesinfo where cname=@cname
if @count=0……
接着是C#实现存储过程的调用问题,这里主要采用 SqlParameter;类进行实现,代码如下:
SqlConnection con = SqlHelp.getcon();
con.Open();
SqlCommand comm = new SqlCommand("pro_cadd", con);
comm.CommandType = CommandType.StoredProcedure; // 设置SqlCommand的属性为存储过
SqlParameter[] param ={ new SqlParameter("@cname", SqlDbType.NVarChar, 50),
new SqlParameter("@cpoint", SqlDbType.NVarChar ,50 ),
.
.
.
new SqlParameter("@teamname", SqlDbType.NVarChar, 50)
};
param[0].Value = this.txtcname.Text;
param[1].Value = this.dplcpoint.Text;
param[11].Value = this.dplteamname.Text;
foreach (SqlParameter parameter in param)
{
comm.Parameters.Add(parameter);
}
comm.ExecuteNonQuery();
MessageBox.Show("课程信息录入成功!");
接下来的问题是数据修改的问题,这里主要是通过存储过程根据要求把所要修改的数据显示到文本框,然在使用Update方法进行更新:
SqlConnection con = SqlHelp.getcon();
con.Open();
SqlCommand comm = new SqlCommand("pro_sedit", con);
comm.CommandType = CommandType.StoredProcedure; // 设置SqlCommand的属性为存储过程
SqlParameter[] param ={ new SqlParameter("@stunum",SqlDbType.NVarChar ,50 ),
new SqlParameter("@cname", SqlDbType.NVarChar, 50),
new SqlParameter("@score", SqlDbType.Float ) };
param[0].Value = this.txtsnum.Text;
param[1].Value = this.txtcname.Text;
param[2].Value = this.txtscore.Text;
foreach (SqlParameter parameter in param)
{
comm.Parameters.Add(parameter);
}
comm.ExecuteNonQuery();
MessageBox.Show("修改成功!");
在界面方面也有一个小问题,就是平时我们注册时经常遇到的下拉框的二级联动或者三级联动,因为以前没遇到过,所以一下不知道怎么实现,上网找了一下,有很多实现的方法,但是相比较之下还是下面这个比较适合,不过这个方法有一个限制,就是适用于数据较少的时候,如果像QQ注册那样,省区和市区,县区进行联动的话用这个方法实现就不行了,不过这个时候可以根据几张数据表进行条件的判断就OK啦: case 0:
this.dplmajorname.Items.Clear();
dplmajorname.Items.AddRange(new object[] { "计算机科学与技术 ", "网络工程", "软件工程" });
break;
case 1:
this.dplmajorname.Items.Clear();
dplmajorname.Items.AddRange(new object[] { "测控技术", "信息安全", "电子技术" });
break;
case 2:
this.dplmajorname.Items.Clear();
dplmajorname.Items.AddRange(new object[] { "自动化", "通讯工程", "网络技术" });
break;