深度优先

这个家伙好懒,除了文章什么都没留下

0%

【Asp.Net】专业和岗位管理

这个项目这前面做省份管理,校区管理,岗位管理,专业岗位等,全部都是增删改查

把省份管理做完了,后面的几乎都可以复制粘贴前面的代码了,改一下绑定字段即可。

也没啥新意的,做着做着就失去了动力,如果以后工作都是增删改查,那就太可怕,没劲。

在做专业管理和岗位管理时,两个表很明显是多对多的关系,但设计数据库的人,似乎忘了给关系表

数据库表与表之间多对多关系怎么处理?

1
2
3
4
5
6
7
拆分关系。增加一个表。使之符合范式。  
比如做学生选课系统。多个学生选多门课。这是[多对多关系](https://www.baidu.com/s?wd=%E5%A4%9A%E5%AF%B9%E5%A4%9A%E5%85%B3%E7%B3%BB&tn=44039180_cpr&fenlei=mv6quAkxTZn0IZRqIHckPjm4nH00T1d9n1fsmyc1rH63Phm4uA7W0ZwV5Hcvrjm3rH6sPfKWUMw85HfYnjn4nH6sgvPsT6KdThsqpZwYTjCEQLGCpyw9Uz4Bmy-bIi4WUvYETgN-TLwGUv3EPHT3nj6Lnj6L)。
这样可以写成三个表。
分别为。学生表(学号,姓名)
[课程表](https://www.baidu.com/s?wd=%E8%AF%BE%E7%A8%8B%E8%A1%A8&tn=44039180_cpr&fenlei=mv6quAkxTZn0IZRqIHckPjm4nH00T1d9n1fsmyc1rH63Phm4uA7W0ZwV5Hcvrjm3rH6sPfKWUMw85HfYnjn4nH6sgvPsT6KdThsqpZwYTjCEQLGCpyw9Uz4Bmy-bIi4WUvYETgN-TLwGUv3EPHT3nj6Lnj6L)(课程号,课程名)
选[课表](https://www.baidu.com/s?wd=%E8%AF%BE%E8%A1%A8&tn=44039180_cpr&fenlei=mv6quAkxTZn0IZRqIHckPjm4nH00T1d9n1fsmyc1rH63Phm4uA7W0ZwV5Hcvrjm3rH6sPfKWUMw85HfYnjn4nH6sgvPsT6KdThsqpZwYTjCEQLGCpyw9Uz4Bmy-bIi4WUvYETgN-TLwGUv3EPHT3nj6Lnj6L)(学号,课程号)
通过选[课表](https://www.baidu.com/s?wd=%E8%AF%BE%E8%A1%A8&tn=44039180_cpr&fenlei=mv6quAkxTZn0IZRqIHckPjm4nH00T1d9n1fsmyc1rH63Phm4uA7W0ZwV5Hcvrjm3rH6sPfKWUMw85HfYnjn4nH6sgvPsT6KdThsqpZwYTjCEQLGCpyw9Uz4Bmy-bIi4WUvYETgN-TLwGUv3EPHT3nj6Lnj6L),将学生和课程联系起来了。

通常情况是这么处理,但自己不想再建表了。
于是乎想了个用一个字段关系也能表示其内在的关联。

想法比较大胆,思想比较歪。

任何一个整数都可以转化成一个二进制数,

如0==》0000,1==》0001,2==》0010,3==》0011,4==》0100,5==》1001

而0,1就能代表关联表中有哪些对应的字段

数据设计是这样的:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
--4,岗位表
create table Station
(
StationID int primary key , --岗位ID
StationName varchar(50) not null, --岗位名称
Remarks varchar(50), --岗位被准
)
insert into Station values(1,'软件测试','软测');
insert into Station values(2,'软件开发','开发');
insert into Station values(4,'php','最好的语言');
insert into Station values(8,'.net开发','aa');
insert into Station values(16,'Android开发','bb');
insert into Station values(32,'java开发','cc');
insert into Station values(64,'javaScript','cc');

select * from Station where StationName like'%%' order by StationID desc

go
--5,专业表
create table Major
(
proID int primary key identity(1,1), --专业ID
proName varchar(50) not null, --专业名称
SchoolID int not null references School(SchoolID), --校区ID(外键)
StationS int, --和岗位关系
Remarks varchar(50), --岗位备注
)
insert into Major values('软件测试',1,0,'测试')
insert into Major values('软件工程',1,3,'');
insert into Major values('软件测试',1,11,'');
insert into Major values('网络工程',1,4,'');
insert into Major values('图形图像',2,38,'');
insert into Major values('软件测试',3,21,'');
insert into Major values('网络工程',3,7,'');
insert into Major values('图形图像',3,38,'');

岗位表的编号采用2的n次幂,专业表中的StationS用一个数字可以代表岗位表中关联的岗位

如岗位表中的80,可以推算出岗位表中有64+16这两个岗位组成的

大概关系就是那样的,主要是每次把数组转换成”外键关系“,需要进行计算,然后做增删改查也比较麻烦

岗位的查询,添加,取消

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
/// <summary>
/// 绑定专业对应的岗位信息
/// </summary>
/// <param name="majorID"></param>
private void GetHideMajorInfo(string majorID)
{
Model.majorModel model = new Model.majorModel();
model.PproName = "";
model.PproID = int.Parse(majorID);
DataTable dt = bll.MajorAndSchool(model);
this.txtMajorName.Text=dt.Rows[0]["proName"].ToString();
this.txtSchool.Text=dt.Rows[0]["SchoolName"].ToString();
int GGNumber=int.Parse(dt.Rows[0]["StationS"].ToString());

DataTable gws = bll.selectStation();
this.DDLStationMy.Items.Clear();
foreach (DataRow row in gws.Rows)
{
int p = int.Parse(row["StationID"].ToString());
if(p<= GGNumber)
{
GGNumber -= p;
string key = row["StationName"].ToString();
string value = row["StationID"].ToString();
this.DDLStationMy.Items.Add(new ListItem(key, value));
if (GGNumber == 0) break;
}
}
}
/// <summary>
/// 绑定所有岗位信息
/// </summary>
private void GetBindDDLStation()
{
this.DDLStationAll.DataSource = bll.selectStation();
this.DDLStationAll.DataTextField = "StationName";
this.DDLStationAll.DataValueField = "StationID";
this.DDLStationAll.DataBind();
}


/// <summary>
/// 添加岗位
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void btnAdd_Click(object sender, EventArgs e)
{
string MajorID = Request.QueryString["MajorID"];
int number =int.Parse(this.DDLStationAll.SelectedValue);
foreach ( ListItem ll in DDLStationMy.Items)
{
if(ll.Value== number.ToString())
{
ClientScript.RegisterStartupScript(GetType(), "UserMain", "alert('该专业已经存在!')", true);
return;
}
}
bll.AddStationbyNumber('+', number,int.Parse(MajorID));
GetHideMajorInfo(MajorID);
}
/// <summary>
/// 取消岗位
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void btnUpa_Click(object sender, EventArgs e)
{
string MajorID = Request.QueryString["MajorID"];
int number = int.Parse(this.DDLStationMy.SelectedValue);
bll.AddStationbyNumber('-', number, int.Parse(MajorID));
GetHideMajorInfo(MajorID);
}

设置添加新岗位的ID编号

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
BLL.StationBLL bll = new BLL.StationBLL();
/// <summary>
/// 设置新加的岗位ID
/// </summary>
private void GetTxtStationID()
{
DataTable dt = bll.SelectStationID();//查询Station表中所有的ID
for (int newId = 1; newId < Math.Pow(2,31); newId *= 2)
{
bool falg = true;//新创建的id能否使用
foreach (DataRow row in dt.Rows)
{
int id = int.Parse(row["StationID"].ToString());//数据库中的id
if(id== newId)//新创建的id数据库中已经存在
{
falg = false;//新创建的id不能用
break;//跳出循环,在创建一个newID
}
}
if (falg)//新创建的id可以用,找到了,赋值,跳出循环
{
this.txtStationID.Text = newId.ToString();
break;
}
}
}

修改专业的岗位SQL语句:

1
2
3
4
5
6
7
8
9
10
11
/// <summary>
/// 修改专业的岗位信息
/// </summary>
/// <param name="addNumber"></param>
/// <param name="majorId"></param>
/// <returns></returns>
public bool AddStationbyNumber(char fuhao, int Number,int majorId)
{
string sql = string.Format("update Major set StationS{0}={1} where proID={2}", fuhao, Number, majorId);
return DbHelperSQL.ExecuteSql(sql)>0?true:false;
}

数据库删除某个岗位,对应专业中减去该岗位的数值

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
/// <summary>
/// 删除岗位表中的数据
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
public bool DeleteStationByID(int id)
{
string sql = "delete Station where StationID="+id;
UpdateMajorByStation(id);
return DbHelperSQL.ExecuteSql(sql) > 0 ? true : false;
}
/// <summary>
/// 删除岗位表中数据更新专业表中number
/// </summary>
/// <param name="id"></param>
public void UpdateMajorByStation(int id)
{
DAL.majorDAL major = new majorDAL();
DataTable dt = major.selectMajorAll();
DataTable Station = SelectStationInfo("");
foreach (DataRow row in dt.Rows)
{
int number = int.Parse(row["StationS"].ToString());
foreach (DataRow item in Station.Rows)
{
int p = int.Parse(item["StationID"].ToString());
if (number >= p)
{
number -= p;
if (p == id)
{
updateMajorNumber(row["proID"].ToString(), id);
}
}
}
}
}

public void updateMajorNumber(string Majorid,int id)
{
string sql =string.Format("update Major set StationS-={0} where proID={1}",id,Majorid);
DbHelperSQL.ExecuteSql(sql);
}

ps:好多没解释清楚。算了就这样把