基于C#结合SQL设计学生成绩系统系统

这是数据库大作业,原本想的是用python和SQL,但遇到了很多错误,相对C#也很麻烦,因此换了C#。但还是先记录一下基于python时的错误,错误基本是在连接数据库时发生的。

错误集合

  • 需要打开对应服务器的TCP/IP 协议,而且修改后需要重启服务器!!!

详细操作步骤:

  • 需要修改IPAII的TCP端口为1433, 详细操作步骤:
  • 需要连接服务器
  • 采用Windows身份认证登陆自己电脑上的数据库时,一定要有host

python连接数据库代码

conn = pymssql.connect(host = 'localhost',server='LENOVO-PC\LOKII',database = "S-T")

以下为C#部分

呈现效果

基本布局如下,就最基本的那种窗口体。

listview效果

datagridview效果

C#代码

C#的语言风格和C挺像的,简洁规范,不会太难,很容易上手。这个系统用的的C#控件也不多,除了button和text,也就是listview和datagridview,这两个只要弄清楚最基本的规则也差不多够用了。

每个窗体就相当于一个单独的子程序,所以需要声明全局变量,从而获得老师的登录名用于成绩展示的部分。

  • 声明全局变量

    1.先新建一个cs文件,声明全局变量

    2.在登录页将用户名保存为需要传递的字符串

    3.在别的窗体使用该字符串

//1
namespace 学生成绩系统
{
    class stloginname
    {
        public static string passData;
    }
}


//2            
            teloginname .passData = textBox1.Text.Trim ();//保存传递的字符串
            查询所教课程  myForm = new 查询所教课程 ();//构建B窗体的一个实例

//3
            string tno = "";
            tno = teloginname .passData;
  • 数据库连接部分,这里连接的是本地数据库,所以没有设置服务器名字。若需远程连接,需确保与要连接的数据库处于同一个局域网中。
              SqlConnection conn = new SqlConnection("server=;uid=sa;pwd=12345678;database=ScoreSearch");
              conn.Open();
    
  • 窗口跳转部分,从登录页面跳回开始页面(即成绩系统)。
              成绩系统 f = new 成绩系统();
              f.Owner = this;
              this.Hide();
              f.ShowDialog();
              Application.ExitThread();
    
  • 登录部分的设计,算是静态登录,不是动态。即不是给每一个登录用户在数据库里面创建一个身份,而是在表记录他们的用户名和密码。从而直接将获得的登录名、密码与表里面的进行匹配,然后直接以sa的身份登录进去。
            string loginname = textBox1.Text.Trim();   //获取文本框里输入的用户名
            string loginpwd = textBox2.Text.Trim();
            
            //检查输入是否为空
                        if (String.IsNullOrEmpty(loginname) || String.IsNullOrEmpty(loginpwd))
            {
                MessageBox.Show("用户名或密码不能为空");
                return;
            }
            
            
            //获取表里所记录的用户名和密码并进行匹配
            string st1 = "select 班主任编号 from classteacher_info where (班主任编号='" + textBox1.Text + "')";
            SqlCommand my1 = new SqlCommand(st1, conn);
            SqlDataReader sdr = my1.ExecuteReader();
            if (sdr.HasRows)
            {
                sdr.Close();
                string st2 = "select 班主任密码 from classteacher_info where (班主任编号='" + textBox1.Text + "')";
                SqlCommand my2 = new SqlCommand(st2, conn);
                string text1 = my2.ExecuteScalar().ToString();
                text1 = text1.Trim();
                string text2 = textBox2.Text;
                text2 = text2.Trim();
                if (text1 ==text2)
                {
                    MessageBox.Show("登录成功!");
                    conn.Close();
                    班主任操作页 f = new 班主任操作页();
                    f.Owner = this;
                    this.Hide();
                    f.ShowDialog();
                    Application.ExitThread();
                }
                else
                {
                    conn.Close();
                    MessageBox.Show("用户不存在或密码错误!");
                    textBox1.Text = "";
                    textBox2.Text = "";
                }

            }
            else
            {
                conn.Close();
                MessageBox.Show("用户不存在或密码错误!");
                textBox1.Text = "";
                textBox2.Text = "";
            }         

注意,获取text输入最好trim一下,以免有空格,导致无法匹配。

  • listview操作部分,包括读取和写入
              listView1.Items.Clear();  //清空listview
              string ctno = "";
              ctno = ctloginname.passData;
    
              SqlConnection conn = new SqlConnection("server=;uid=sa;pwd=12345678;database=ScoreSearch");
              conn.Open();
    
              string st1 = "select 班主任所在专业 from classteacher_info where (班主任编号='" + ctno + "')";
              SqlCommand my1 = new SqlCommand(st1, conn);           //定义OleDbCommnad对象并连接数据库 
              string maj = my1.ExecuteScalar().ToString();
    
              string st2 = "select * from score_info where (学生专业='" + maj + "') ";
              SqlCommand my2 = new SqlCommand(st2, conn);           //读入学生编号和学生姓名
              SqlDataReader dr = my2.ExecuteReader();
    
              while (dr.Read())
              {
                  //构建一个ListView的数据,存入数据库数据,以便添加到listView1的行数据中
                  ListViewItem lt = new ListViewItem();
                  //将数据库数据转变成ListView类型的一行数据
                  lt.Text = dr["学生编号"].ToString();
                  lt.SubItems.Add("");     //添加空的一列,后面再填上
                  lt.SubItems.Add(dr["课程编号"].ToString());
                  lt.SubItems.Add("");
                  lt.SubItems.Add(dr["总成绩"].ToString());
                  //将lt数据添加到listView1控件中
                  listView1.Items.Add(lt);
              }
              dr.Close();
    
              for (int i = 0; i < listView1.Items.Count; i++)    //循环listview的每一行
              {
                  string cno = null;
                  string sno = null;
                  ListViewItem item = listView1.Items[i];      //listview的第i行
                  cno = cno + item.SubItems[2].Text;           //获取listview第i行第3列的文本内容
                  sno = sno + item.SubItems[0].Text;
                  string cn = "select 课程名称 from class_info where (课程编号='" + cno + "')";
                  SqlCommand my3 = new SqlCommand(cn, conn);           //查询课程名称
                  string text2 = my3.ExecuteScalar().ToString();
                  listView1.Items[i].SubItems[3].Text = text2;
    
                  string st3 = "select 学生姓名 from student_info where (学生编号='" + sno + "')";
                  SqlCommand m3 = new SqlCommand(st3, conn);
                  string text3 = m3.ExecuteScalar().ToString();
                  listView1.Items[i].SubItems[1].Text = text3;
              }
              conn.Close();
    
  • datagridview操作部分
              textBox3.Text = "";
              if (dataGridView1.DataSource != null)
    
              {
                  DataTable dt = (DataTable)dataGridView1.DataSource;
                  dt.Rows.Clear();                               //没有搜索时,datagridview为空,所以要清空一下
                  dataGridView1.DataSource = dt;
              }
              else
    
              {
                  dataGridView1.Rows.Clear();
             }
    
              string tno = "";
              tno = teloginname.passData;
    
              SqlConnection conn = connection();
              conn.Open();
    
              string tes = "select 课程编号 from class_info where 课程编号='" + comboBox1.Text.Trim() + "' and 老师编号='"+ tno + "'";
              SqlCommand myin = new SqlCommand(tes, conn);
              SqlDataReader sdr = myin.ExecuteReader();
              sdr.Read();
              if (sdr.HasRows)
              {
                  sdr.Close();
              }
              else
              {
                  MessageBox.Show("课程编号输入错误");
                  return;
              }
    
              string stselect = "select 课程名称 from class_info where 课程编号='" + comboBox1.Text.Trim() + "'";
              SqlCommand myinfo = new SqlCommand(stselect, conn);
              string text2 = myinfo.ExecuteScalar().ToString();
              textBox2.Text = text2;
    
              string qr = "select 平时成绩占比 from class_info where 课程编号='" + comboBox1.Text.Trim() + "'";
              SqlCommand my2 = new SqlCommand(qr, conn);
              string text3 = my2.ExecuteScalar().ToString();
              textBox3.Text = text3;
    
              dataGridView1.AllowUserToAddRows = false;
              dataGridView1.AllowUserToDeleteRows = false;       //不允许删除或添加新的一行,也可以直接在属性设置
    
              string st1 = "select 学生编号,平时成绩,考试成绩,总成绩 from score_info where (课程编号='" + comboBox1.Text.Trim() + "')";
    
              //创建SqlDataAdapter类的对象
              SqlDataAdapter sda = new SqlDataAdapter(st1, conn);
    
              DataSet ds = new DataSet();
              //DataTable dt = new DataTable();
              sda.Fill(ds);
              DataTable dtb = ds.Tables[0];
              //DataGridViewTextBoxColumn mg = new DataGridViewTextBoxColumn();
              //DG.Columns.Add(mg);
              dataGridView1.DataSource = dtb;//把dt的内容绑定到Gridview1里显示。
    
              dataGridView1.AutoGenerateColumns = false;
              dataGridView1.Columns["Column1"].DataPropertyName = dtb.Columns["学生编号"].ToString();
              dataGridView1.Columns["Column3"].DataPropertyName = dtb.Columns["平时成绩"].ToString();
              dataGridView1.Columns["Column4"].DataPropertyName = dtb.Columns["考试成绩"].ToString();
              dataGridView1.Columns["Column5"].DataPropertyName = dtb.Columns["总成绩"].ToString();
              dataGridView1.Columns["考试成绩"].Visible = false;            //展示数据
              dataGridView1.Columns["总成绩"].Visible = false;
              dataGridView1.Columns["平时成绩"].Visible = false;
              dataGridView1.Columns["学生编号"].Visible = false;
    
              for (int i = 0; i < dataGridView1.RowCount; i++)
              {
    
                  string sno = dataGridView1.Rows[i].Cells[0].Value.ToString();
                  string sn = "select 学生姓名 from student_info where 学生编号='" + sno + "'";
                  SqlCommand mn = new SqlCommand(sn, conn);
                  string sname = mn.ExecuteScalar().ToString();
    
                  dataGridView1.Rows[i].Cells[1].Value = sname ;
              }
                  conn.Close();