前一篇,已經把數據庫個設計好了。剩下的就是照着文檔進行編碼了。 文末的源碼
開發環境:
1. Visual Studio 2013
2. SQL server 2008
快速指南:下載源碼,sql2008還原數據庫,vs2013打開項目,編譯執行
一.配置數據庫連接
首先,第一步配置好數據庫連接:
1.在app.config文件里添加連接字符串,如下代碼:

<?xml version="1.0" encoding="utf-8" ?> <configuration> <configSections> </configSections> <connectionStrings> <add name="sql_homework_end.Properties.Settings.sql_homework_endConnectionString" connectionString="Data Source=.;Initial Catalog=sql_homework_end;Integrated Security=True" providerName="System.Data.SqlClient" /> </connectionStrings> <startup> <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" /> </startup> </configuration> 連接字符串
2.建立數據庫公共類:

1 using System; 2 using System.Collections.Generic; 3 using System.Configuration; 4 using System.Data; 5 using System.Data.SqlClient; 6 using System.Linq; 7 using System.Security.Cryptography; 8 using System.Text; 9 using System.Threading.Tasks; 10 11 namespace sql_homework_end 12 { 13 class sqlhelper 14 { 15 private static string connStr = ConfigurationManager.ConnectionStrings["sql_homework_end.Properties.Settings.sql_homework_endConnectionString"].ConnectionString; 16 /// <summary> 17 /// 返回受影響的數據行數 18 /// </summary> 19 /// <param name="sql"></param> 20 /// <returns></returns> 21 public static int ExecuteNoQuery(string sql) 22 { 23 using (SqlConnection conn=new SqlConnection(connStr)) 24 { 25 conn.Open(); 26 using (SqlCommand cmd=conn.CreateCommand()) 27 { 28 cmd.CommandText = sql; 29 return cmd.ExecuteNonQuery(); 30 31 } 32 } 33 } 34 /// <summary> 35 /// 返回一個數據集 36 /// </summary> 37 /// <param name="sql"></param> 38 /// <returns></returns> 39 public static DataSet ExecuteDataSet(string sql) 40 { 41 using (SqlConnection xonn=new SqlConnection(connStr)) 42 { 43 xonn.Open(); 44 using (SqlCommand cmd = xonn.CreateCommand()) 45 { 46 cmd.CommandText = sql; 47 SqlDataAdapter adapter = new SqlDataAdapter(cmd); 48 DataSet dataset = new DataSet(); 49 adapter.Fill(dataset); 50 return dataset; 51 } 52 } 53 } 54 public static object ExecuteScalar(string sql) 55 { 56 using (SqlConnection conn=new SqlConnection(connStr)) 57 { 58 conn.Open(); 59 using (SqlCommand cmd=conn.CreateCommand()) 60 { 61 cmd.CommandText = sql; 62 return cmd.ExecuteScalar(); 63 } 64 } 65 } 66 /// <summary> 67 /// md5加密 68 /// </summary> 69 /// <param name="strPwd"></param> 70 /// <returns></returns> 71 public static string GetMD5(string strPwd) 72 { 73 string pwd = ""; 74 //實例化一個md5對象 75 MD5 md5 = MD5.Create(); 76 // 加密后是一個字節類型的數組 77 byte[] s = md5.ComputeHash(Encoding.UTF8.GetBytes(strPwd)); 78 //翻轉生成的MD5碼 79 s.Reverse(); 80 //通過使用循環,將字節類型的數組轉換為字符串,此字符串是常規字符格式化所得 81 //只取MD5碼的一部分,這樣惡意訪問者無法知道取的是哪幾位 82 for (int i = 3; i < s.Length - 1; i++) 83 { 84 //將得到的字符串使用十六進制類型格式。格式后的字符是小寫的字母,如果使用大寫(X)則格式后的字符是大寫字符 85 //進一步對生成的MD5碼做一些改造 86 pwd = pwd + (s[i] < 198 ? s[i] + 28 : s[i]).ToString("X"); 87 } 88 return pwd; 89 } 90 91 92 } 93 }
二.功能設計
1.登錄功能
界面預覽:
功能有:身份驗證,退出。公共變量傳值。

1 using System; 2 using System.Collections.Generic; 3 using System.ComponentModel; 4 using System.Data; 5 using System.Drawing; 6 using System.Linq; 7 using System.Text; 8 using System.Threading.Tasks; 9 using System.Windows.Forms; 10 11 namespace sql_homework_end 12 { 13 public partial class login : Form 14 { 15 public login() 16 { 17 InitializeComponent(); 18 } 19 20 //界面傳值 21 public static string GlobelValue; // 注意,必須申明為static變量 22 //登錄按鈕事件 23 private void btn_login_Click(object sender, EventArgs e) 24 { 25 if (cmb_identity.Text.ToString()=="管理員") 26 { 27 verify_identidy("tb_admin","admin_name"); 28 main a = new main(); 29 a.Show(); 30 } 31 else if (cmb_identity.Text.ToString()=="學生") 32 { 33 verify_identidy("tb_student","student_name"); 34 studnet s = new studnet(); 35 s.Show(); 36 } 37 38 } 39 //身份驗證的函數 40 private void verify_identidy(string table,string name) 41 { 42 DataSet ds = new DataSet(); 43 ds = sqlhelper.ExecuteDataSet("select * from "+table+" where "+name+" = '" + tbx_loginname.Text + "'"); 44 DataTable dt = new DataTable(); 45 dt = ds.Tables[0]; 46 if (dt.Rows.Count != 0) 47 { 48 GlobelValue = tbx_loginname.Text; 49 this.Visible = false; //隱藏當前窗體 50 } 51 else 52 { 53 MessageBox.Show("用戶名不存在,請重新輸入"); 54 } 55 } 56 //退出按鈕 57 private void btn_close_Click(object sender, EventArgs e) 58 { 59 this.Close(); 60 } 61 62 63 64 } 65 }
2.主界面-管理員
預覽:
管理員信息:
學生信息:
主要使用控件:datagridview
相關代碼:

1 using System; 2 using System.Collections.Generic; 3 using System.ComponentModel; 4 using System.Data; 5 using System.Drawing; 6 using System.Linq; 7 using System.Text; 8 using System.Threading.Tasks; 9 using System.Windows.Forms; 10 11 namespace sql_homework_end 12 { 13 public partial class main : Form 14 { 15 public main() 16 { 17 InitializeComponent(); 18 19 } 20 //綁定並顯示相關信息 21 DataSet ds = new DataSet(); 22 DataTable dt = new DataTable(); 23 private void 學生信息ToolStripMenuItem_Click(object sender, EventArgs e) 24 { 25 ds = sqlhelper.ExecuteDataSet("select * from tb_student"); 26 dt = ds.Tables[0]; 27 dataGridView1.DataSource = dt; 28 } 29 30 private void 課程信息ToolStripMenuItem_Click(object sender, EventArgs e) 31 { 32 ds = sqlhelper.ExecuteDataSet("select * from tb_course"); 33 dt = ds.Tables[0]; 34 dataGridView1.DataSource = dt; 35 } 36 37 private void 選課信息ToolStripMenuItem_Click(object sender, EventArgs e) 38 { 39 ds = sqlhelper.ExecuteDataSet("select * from tb_student_course"); 40 dt = ds.Tables[0]; 41 dataGridView1.DataSource = dt; 42 dataGridView1.Columns["sc_id"].DisplayIndex = 0; 43 } 44 private void 管理員信息ToolStripMenuItem_Click(object sender, EventArgs e) 45 { 46 ds = sqlhelper.ExecuteDataSet("select * from tb_admin"); 47 dt = ds.Tables[0]; 48 dataGridView1.DataSource = dt; 49 } 50 //添加按鈕事件 51 private void btn_insert_Click(object sender, EventArgs e) 52 { 53 if (dataGridView1.Columns[0].HeaderText=="student_num") 54 { 55 string sql = @"insert tb_student (student_num,student_name,student_password,student_sex 56 ,student_age,student_dept)values('" + dataGridView1.Rows[dataGridView1.RowCount - 2].Cells[0].Value + "','" + 57 dataGridView1.Rows[dataGridView1.RowCount - 2].Cells[1].Value + "','" + dataGridView1.Rows[dataGridView1.RowCount - 2].Cells[2].Value 58 + "','" + dataGridView1.Rows[dataGridView1.RowCount - 2].Cells[3].Value + "','" + dataGridView1.Rows[dataGridView1.RowCount - 2].Cells[4].Value 59 + "','" + dataGridView1.Rows[dataGridView1.RowCount - 2].Cells[5].Value + "')"; 60 sqlhelper.ExecuteNoQuery(sql); 61 62 } 63 else if (dataGridView1.Columns[0].HeaderText=="course_num") 64 { 65 string sql = @"insert tb_course (course_num,course_name,course_credit,course_semester)values('" + dataGridView1.Rows[dataGridView1.RowCount - 2].Cells[0].Value + "','" + dataGridView1.Rows[dataGridView1.RowCount - 2].Cells[1].Value + "','" + dataGridView1.Rows[dataGridView1.RowCount - 2].Cells[2].Value + "','" + dataGridView1.Rows[dataGridView1.RowCount - 2].Cells[3].Value + "')"; 66 sqlhelper.ExecuteNoQuery(sql); 67 } 68 else if (dataGridView1.Columns[0].HeaderText=="sc_id") 69 { 70 try 71 { 72 string sql = @"insert tb_student_course (sc_id,student_num,course_num,grade)values('" + dataGridView1.Rows[dataGridView1.RowCount - 2].Cells[0].Value + "','" + dataGridView1.Rows[dataGridView1.RowCount - 2].Cells[1].Value + "','" + dataGridView1.Rows[dataGridView1.RowCount - 2].Cells[2].Value + "','" + dataGridView1.Rows[dataGridView1.RowCount - 2].Cells[3].Value + "')"; 73 sqlhelper.ExecuteNoQuery(sql); 74 } 75 catch (Exception) 76 { 77 MessageBox.Show("學號或姓名不存在,請重新添加。"); 78 } 79 80 } 81 else if (dataGridView1.Columns[0].HeaderText == "admin_id") 82 { 83 string sql = @"insert tb_admin (admin_id,admin_name,admin_password,remark)values('" + dataGridView1.Rows[dataGridView1.RowCount - 2].Cells[0].Value + "','" + dataGridView1.Rows[dataGridView1.RowCount - 2].Cells[1].Value + "','" + dataGridView1.Rows[dataGridView1.RowCount - 2].Cells[2].Value + "','" + dataGridView1.Rows[dataGridView1.RowCount - 2].Cells[3].Value + "')"; 84 sqlhelper.ExecuteNoQuery(sql); 85 } 86 MessageBox.Show("添加成功"); 87 } 88 //更新按鈕事件 89 private void btn_update_Click(object sender, EventArgs e) 90 { 91 if (dataGridView1.Columns[0].HeaderText == "student_num") 92 { 93 update("tb_student","student_num"); 94 } 95 else if (dataGridView1.Columns[0].HeaderText == "course_num") 96 { 97 update("tb_course","course_num"); 98 } 99 else if (dataGridView1.Columns[0].HeaderText == "admin_id") 100 { 101 update("tb_admin","admin_id"); 102 } 103 else if (dataGridView1.Columns[0].HeaderText == "sc_id") 104 { 105 try 106 { 107 update("tb_studnet_course","sc_id"); 108 } 109 catch (Exception) 110 { 111 MessageBox.Show("學號或課程號不存在,請重新輸入"); 112 throw; 113 } 114 } 115 } 116 //更新方法 117 private void update(string table,string head_id) 118 { 119 for (int i = 0; i < dataGridView1.RowCount; i++) 120 { 121 int id = Convert.ToInt32(dataGridView1.Rows[i].Cells[0].Value); 122 for (int j = 1; j < dataGridView1.ColumnCount; j++) 123 { 124 if (dataGridView1.Columns[j].Visible == true) 125 { 126 string columnName = dataGridView1.Columns[j].Name.ToString(); 127 string sql = "update " + table + " set " + columnName + "='" + dataGridView1.Rows[i].Cells[j].Value + "' where " + head_id + "='" + id + "'"; 128 sqlhelper.ExecuteNoQuery(sql); 129 } 130 } 131 } 132 MessageBox.Show("更新成功"); 133 } 134 135 //刪除事件 136 private void btn_delete_Click(object sender, EventArgs e) 137 { 138 if (dataGridView1.Columns[0].HeaderText == "student_num") 139 { 140 string sql = "delete from tb_student where student_num='" + dataGridView1.SelectedCells[0].Value + "'"; 141 sqlhelper.ExecuteNoQuery(sql); 142 } 143 else if (dataGridView1.Columns[0].HeaderText == "course_num") 144 { 145 string sql = "delete from tb_course where course_num='" + dataGridView1.SelectedCells[0].Value + "'"; 146 sqlhelper.ExecuteNoQuery(sql); 147 } 148 else if (dataGridView1.Columns[0].HeaderText == "sc_id") 149 { 150 string sql = "delete from tb_student_course where sc_id='" + dataGridView1.SelectedCells[0].Value + "'"; 151 sqlhelper.ExecuteNoQuery(sql); 152 } 153 else if (dataGridView1.Columns[0].HeaderText == "admin_id") 154 { 155 string sql = "delete from tb_admin where admin_id='" + dataGridView1.SelectedCells[0].Value + "'"; 156 sqlhelper.ExecuteNoQuery(sql); 157 } 158 MessageBox.Show("刪除成功"); 159 } 160 161 //界面載入顯示身份和登錄時間 162 private void main_Load(object sender, EventArgs e) 163 { 164 lbl_username.Text = "Welcome," + login.GlobelValue + ""; 165 lbl_logintime.Text ="登錄時間:" +DateTime.Now.ToString()+""; 166 } 167 } 168 }
3.學生界面
界面預覽:
個人信息顯示:在這個界面,學生能看到自己的信息,並進行修改操作。
代碼:

1 using System; 2 using System.Collections.Generic; 3 using System.ComponentModel; 4 using System.Data; 5 using System.Drawing; 6 using System.Linq; 7 using System.Text; 8 using System.Threading.Tasks; 9 using System.Windows.Forms; 10 11 namespace sql_homework_end 12 { 13 public partial class studnet : Form 14 { 15 public studnet() 16 { 17 InitializeComponent(); 18 } 19 20 DataSet ds = new DataSet(); 21 DataTable dt = new DataTable(); 22 private void studnet_Load(object sender, EventArgs e) 23 { 24 lbl_username.Text = "Welcome," + login.GlobelValue + ""; 25 lbl_logintime.Text = "登錄時間:" + DateTime.Now.ToString() + ""; 26 27 28 } 29 //相關信息顯示 30 private void 個人信息ToolStripMenuItem_Click(object sender, EventArgs e) 31 { 32 ds = sqlhelper.ExecuteDataSet("select * from tb_student where student_name='" + login.GlobelValue + "'"); 33 dt = ds.Tables[0]; 34 dataGridView1.DataSource = dt; 35 btn_update.Visible = true; 36 btn_insert.Visible = false; 37 btn_delete.Visible = false; 38 } 39 40 private void 課程信息ToolStripMenuItem_Click(object sender, EventArgs e) 41 { 42 43 ds = sqlhelper.ExecuteDataSet("select * from tb_course"); 44 dt = ds.Tables[0]; 45 dataGridView1.DataSource = dt; 46 btn_update.Visible = false; 47 btn_insert.Visible = false; 48 btn_delete.Visible = false; 49 } 50 51 private void 選課管理ToolStripMenuItem_Click(object sender, EventArgs e) 52 { 53 54 ds = sqlhelper.ExecuteDataSet(@"select sc.sc_id,s.student_num,c.course_num,c.course_name,grade 55 from tb_student_course sc join tb_student s on sc.student_num=s.student_num 56 join tb_course c on sc.course_num=c.course_num 57 where s.student_name = '" + login.GlobelValue + "'"); 58 dt = ds.Tables[0]; 59 dataGridView1.DataSource = dt; 60 dataGridView1.Columns["sc_id"].DisplayIndex = 0; 61 btn_update.Visible = false; 62 btn_insert.Visible = true; 63 btn_delete.Visible = true; 64 } 65 //學生選課功能 66 private void btn_insert_Click_1(object sender, EventArgs e) 67 { 68 if (Convert.ToInt32(dataGridView1.Rows[dataGridView1.RowCount - 2].Cells[4].Value) > 0) 69 { 70 MessageBox.Show("不准填寫成績"); 71 } 72 else 73 { 74 string sql = @"insert tb_student_course (sc_id,student_num,course_num)values('" + dataGridView1.Rows[dataGridView1.RowCount - 2].Cells[0].Value + "','" + dataGridView1.Rows[dataGridView1.RowCount - 2].Cells[1].Value + "','" + dataGridView1.Rows[dataGridView1.RowCount - 2].Cells[2].Value + "')"; 75 sqlhelper.ExecuteNoQuery(sql); 76 MessageBox.Show("選課成功"); 77 } 78 } 79 //刪除選的課程 80 private void btn_delete_Click(object sender, EventArgs e) 81 { 82 string sql = "delete from tb_student_course where sc_id='" + dataGridView1.SelectedCells[0].Value + "'"; 83 sqlhelper.ExecuteNoQuery(sql); 84 MessageBox.Show("刪除成功,請重新選課。"); 85 } 86 //更新個人信息 87 private void btn_update_Click(object sender, EventArgs e) 88 { 89 update("tb_student", "student_num"); 90 } 91 private void update(string table, string head_id) 92 { 93 for (int i = 0; i < dataGridView1.RowCount; i++) 94 { 95 int id = Convert.ToInt32(dataGridView1.Rows[i].Cells[0].Value); 96 for (int j = 1; j < dataGridView1.ColumnCount; j++) 97 { 98 if (dataGridView1.Columns[j].Visible == true) 99 { 100 string columnName = dataGridView1.Columns[j].Name.ToString(); 101 string sql = "update " + table + " set " + columnName + "='" + dataGridView1.Rows[i].Cells[j].Value + "' where " + head_id + "='" + id + "'"; 102 sqlhelper.ExecuteNoQuery(sql); 103 } 104 } 105 } 106 MessageBox.Show("更新成功"); 107 } 108 109 } 110 }
最后,寫得有點亂啊。看不懂的話,可以看源碼。