现在可以根据之前画的图来建立数据库了,打开SSMS,建立五张表。
1 USE EducationManager 2 3 GO 4 5 CREATE TABLE Department 6 ( 7 DeptId nvarchar(4), -- 系编号,用于生成学号 8 Name nvarchar(20) NOT NULL, -- 系名 9 CONSTRAINT PK_DeptId PRIMARY KEY (DeptId) 10 ) 11 12 CREATE TABLE Building 13 ( 14 BldgName nvarchar(6), 15 RoomNum int, 16 CONSTRAINT PK_Bldg PRIMARY KEY (BldgName, RoomNum) 17 ) 18 19 CREATE TABLE Teacher 20 ( 21 TchId nvarchar(4), -- 教师编号 22 DeptId nvarchar(4), -- 教师所属学院编号 23 BldgName nvarchar(6), -- 办公室建筑名 24 RoomNum int, -- 办公室编号 25 Name nvarchar(20) NOT NULL, -- 教师名 26 Gender bit NOT NULL, -- 性别 27 Title numeric(8, 2) NOT NULL, -- 职称 28 PhoneNum nvarchar(11) NOT NULL, -- 电话 29 CONSTRAINT PK_TchId PRIMARY KEY (TchId), 30 CONSTRAINT FK_Tch_DeptId FOREIGN KEY (DeptId) REFERENCES Department(DeptId), 31 CONSTRAINT FK_Tch_BldgName FOREIGN KEY (BldgName, RoomNum) REFERENCES Building(BldgName, RoomNum) 32 ) 33 34 CREATE TABLE Location 35 ( 36 Province nvarchar(10), -- 省 37 City nvarchar(20), -- 市 38 CONSTRAINT PK_Loc PRIMARY KEY (Province, City), 39 ) 40 41 CREATE TABLE Class 42 ( 43 ClassId nvarchar(4), -- 班级编号 44 DeptId nvarchar(4), -- 系编号 45 CONSTRAINT PK_ClsId PRIMARY KEY (ClassId), 46 CONSTRAINT FK_Cls_DeptId FOREIGN KEY (DeptId) REFERENCES Department(DeptId), 47 ) 48 49 CREATE TABLE Student 50 ( 51 StdId nvarchar(12), -- 学号 52 DeptId nvarchar(4), -- 学院编号 53 Province nvarchar(10), -- 省 54 City nvarchar(20), -- 市 55 Name nvarchar(20) NOT NULL, -- 姓名 56 Gender bit NOT NULL, -- 性别 57 Birthday datetime NOT NULL, -- 出生日期 58 ClassId nvarchar(4) NOT NULL, -- 班级编号 59 Credit numeric(3, 1) CHECK (Credit >= 0), -- 已修学分 60 CONSTRAINT PK_StdId PRIMARY KEY (StdId), 61 CONSTRAINT FK_Std_DeptId FOREIGN KEY (DeptId) REFERENCES Department(DeptId), 62 CONSTRAINT FK_Std_ClsId FOREIGN KEY (ClassId) REFERENCES Class(ClassId), 63 CONSTRAINT FK_Std_Loc FOREIGN KEY (Province, City) REFERENCES Location(Province, City), 64 ) 65 66 CREATE TABLE Course 67 ( 68 CourseId nvarchar(4), -- 课程编号 69 DeptId nvarchar(4), -- 系编号 70 TchId nvarchar(4), -- 授课教师 71 ClassId nvarchar(4), -- 上课班级 72 BldgName nvarchar(6), -- 教学楼 73 RoomNum int, -- 教室 74 Name nvarchar(20) NOT NULL, -- 课程名 75 Credit numeric(3, 1) CHECK (Credit >= 0), -- 学分 76 Semester nvarchar(12) NOT NULL, -- 学年 77 ClassHour int NOT NULL, -- 学时 78 CONSTRAINT PK_CourseId PRIMARY KEY (CourseId), 79 CONSTRAINT FK_Course_DeptId FOREIGN KEY (DeptId) REFERENCES Department(DeptId), 80 CONSTRAINT FK_Course_TchId FOREIGN KEY (TchId) REFERENCES Teacher(TchId), 81 CONSTRAINT FK_Course_ClsId FOREIGN KEY (ClassId) REFERENCES Class(ClassId), 82 CONSTRAINT FK_Course_BldgName FOREIGN KEY (BldgName, RoomNum) REFERENCES Building(BldgName, RoomNum) 83 ) 84 85 -- 由于课程是按照班级来上,所以只需要比较班级编号即可,不用再建表 86 87 CREATE TABLE Report 88 ( 89 StdId nvarchar(12), -- 学号 90 CourseId nvarchar(4), -- 课程编号 91 Grade int CHECK (0 <= Grade and Grade <= 100), -- 成绩 92 CONSTRAINT FK_Rep_StdId FOREIGN KEY (StdId) REFERENCES Student(StdId), 93 CONSTRAINT FK_Rep_CourseId FOREIGN KEY (CourseId) REFERENCES Course(CourseId) 94 )
建立好之后回到VS,右键项目EducationManagerClass(刚发现本来是想叫Library的,结果打成了Class……懒得改了反正一样用啊哈哈),选择属性,设置,点击添加一个设置文件,然后在加入两个属性:connectionString,类型为string,值为Data Source=你的服务器名;Initial Catalog=EducationManager;Persist Security Info=True; 和 remeberMe,类型为bool,值为False。
这两个属性分别用来记录连接字符串和下次自动登录。
接下来,依旧是Class项目中,新建类AppDbConnection,这个类将用来连接数据库,并进行各种操作,代码如下
1 using System.Data.SqlClient; 2 using EductionManagerClass.Properties; 3 4 namespace EductionManagerClass 5 { 6 public class AppDbConnection 7 { 8 private static string AppConnectionString { get; set; } = Settings.Default.connectionString; // C# 6.0 9 10 public bool Login(string uid, string pwd, bool remeberMe) 11 { 12 var connectionStr = AppConnectionString + "User ID=" + uid + ";Password=" + pwd; 13 SqlConnection con = new SqlConnection(connectionStr); 14 bool sucess = false; 15 16 try 17 { 18 con.Open(); 19 sucess = true; 20 AppConnectionString = connectionStr; 21 if (remeberMe) 22 { 23 Settings.Default.connectionString = connectionStr; 24 Settings.Default.remeberMe = true; 25 Settings.Default.Save(); 26 } 27 } 28 catch 29 { 30 sucess = false; 31 } 32 finally 33 { 34 con.Close(); 35 } 36 37 return sucess; 38 } 39 } 40 }
之前在配置文件中的连接字符串是没有提供登录名和密码的,所以在Login方法中需要作为参数提供。登录成功后会修改AppDbConnection中的连接字符串,同时,当remeberMe 为true 的时候,将会修改配置文件,使其记录登录名和密码,否则的话,程序会在下一次启动时依旧要求验证登录名和密码。
登录的验证方法很简单:用一个临时的string来保存加上参数的连接字符串,然后尝试连接并打开数据库,如果出错则会抛出异常,并返回false;否则就是登录成功,保存可用的字符串后返回true。
另外需要注意的是,这里给AppConnectionString 赋值的语句为C# 6.0 的语法。
接下来,在UI项目中,新建一个窗口,名为Login.xaml ,打开App.xaml,将其中的StartUri的值改为Login.xaml,保存并按Ctrl+shift+B 编译一次。
再点击解决方案资源管理器中App.xaml旁边的小三角,打开App.xaml.cs,并在App 类中添加代码
1 using System.Windows; 2 using EductionManagerClass; // 注意加这个! 3 4 namespace EductionManagerUI 5 { 6 /// <summary> 7 /// App.xaml 的交互逻辑 8 /// </summary> 9 public partial class App : Application 10 { 11 public static AppDbConnection AppDbconnection { get; } = new AppDbConnection(); // C# 6.0 12 } 13 }
这样,就添加了一个单例模式的AppDbConnection 实例,之后便可直接用App.AppDbConnection 来调用各种方法。
打开Login.xaml,添加登录名和密码的输入框,以及记住我的选择框,还有登录按钮。注意密码框应该使用PasswordBox 而不是TextBox。
我这不小心加了点特效,不过这不是重点,具体的代码回头传git上,地址在最下面……接下来给登录按钮加上点击事件
<Button x:Name="loginButton" Content="登录" Margin="150,266,149,0" VerticalAlignment="Top" Background="{x:Null}" Foreground="#FF007ACC" BorderBrush="#FF007ACC" FontSize="16" Style="{StaticResource NormalButtonStyle}" Click="loginButton_Click"/>
在输入Click之后按回车键,智能提示会出现添加新事件的选项,选择之后VS会自动帮你在Login.xaml.cs中新建一个空的事件,现在打开Login.xaml.cs,修改事件代码
1 private void loginButton_Click(object sender, RoutedEventArgs e) 2 { 3 var success = App.AppDbconnection.Login(uidTextBox.Text, pwsTextBox.Password, remeberMeCheckBox.IsChecked ?? false); 4 if (success) 5 MessageBox.Show("Success!"); 6 else 7 MessageBox.Show("Something Wrong!"); 8 }
在Login 的参数中,用?? 运算符来保证checkbox 的值在为null 的时候也返回false。
至此,连接以及登录功能已经完成。然后在菜单中选择视图,打开团队资源管理器,选择更改,并填写修改信息,点击提交并推送。
这时会提醒你连接到一个git 仓库,只需要去github (其他的也可以)上新建一个仓库,然后将url 拷过来就好,选择发布,会钻出来一个光头,让你填写git的账号密码,登录后就会自动推到git上。
最后放上git: github/LzxHahaha
转载请注明出处:LzxHahaha-博客园