这是数据库大作业,原本想的是用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();