最近由于考研复试需要,记录与总结一下自己的学习所得。
事先备注开发环境(VS2015+Sqlserver2012),主要以分享代码及注意事项为主,具体实现背后的原理,看到此文的有缘者可自行深入学习。
1.如何在sqlserver中建立数据表与插入数据?
以建立员工关系表EMPLOYEE,工作关系表WORKS和公司关系表COMPANY为例:
初始表数据如下:
EMPLOYEE
EmpNo | EmpNmae | EmpSex | EmpAge |
E01 | 张三 | 女 | 32 |
E02 | 李四 | 男 | 28 |
E03 | 王五 | 女 | 42 |
E04 | 赵六 | 男 | 37 |
WORKS
EmpNo | CmpNo | Salary |
E01 | C01 | 3000 |
E01 | C02 | 4000 |
E02 | C02 | 5000 |
E02 | C03 | 2500 |
E03 | C01 | 3500 |
E04 | C02 | 3000 |
COMPANY
CmpNo | CmpName |
C01 | 阳光科技 |
C02 | 晨光科技 |
C03 | 未来科技 |
代码段如下:
create table [EMPLOYEE](
EmpNo varchar(8) not null primary key,
EmpName varchar(30) not null,
EmpSex varchar(2) not null,
EmpAge int check (EmpAge > -1)
)
create table [COMPANY](
CmpNo varchar(8) not null primary key,
CmpName varchar(30) not null
)
create table [WORKS](
EmpNo varchar(8) not null references EMPLOYEE(EmpNo),
CmpNo varchar(8) not null references COMPANY(CmpNo),
Salary int check(Salary > -1)
)
注意事项:1.对于主键的设置,一张表只能有一个主键,使用primary key进行设置;
2.建表顺序,前面所给表顺序其实带有一个陷阱,即WORKS中的EmpNo与CmpNo是需依赖于另外两张表的,故建表顺序需进行相应调整,后引用外键可用references;
3.表名使用[ ]修饰起来,是为了防止与sql语句关键字可能会发生冲突。
2.窗体程序如何与sqlserver建立连接,且如何对数据库中表信息进行增删改查等操作?
基于面向对象的思想,我们可将与数据库进行交互的这类动作封装到一个类中,类名为:sql_operate,具体实现如下:
using System;
using System.Collections.Generic;
using System.Text;
//下两个使用的是实现功能的关键
using System.Data;
using System.Data.SqlClient;
namespace [自己的项目名]
{
class sql_operate : iDisposable
{
private SqlConnection sqlConnection;
public DB ()
{
sqlConnection = new SqlConnection (@"server=服务器名称;database=数据库
名;Trusted_connection=SSPI");
sqlConnection.Open();
}
//获取数据库返回数据(以Datatable类型存储)
public DataTable getbysql(string sql)
{
SqlDataAdapter sqlDataAdapter = new SqlDataAdapter(new SqlCommand(sql,
sqlConnection));
DataTable dataTable = new DataTable();
sqlDataAdapter.Fill(dataTable);
return dataTable;
}
//进行增删改操作
public void setbyssql(string sql)
{
new SqlCommand(sql, sqlConnection).ExecuteNonQuery();
}
//将连接进行关闭
public void Dispose()
{
sqlConnection.Close();
}
}
}
3.窗体程序实现目标为:
1.实现根据输入的员工名查询员工所在公司及薪水,并在窗体进行显示,且按薪水增序排列;
2.实现根据公司名(下拉选择)查询员工信息,即员工号、员工名、公司名与薪水;
且要求两功能需在不同界面实现。
界面如下所示:
实现代码端如下:(涉及Listview、comboBox与button等控件的使用)
DB db;
public Form1()
{
InitializeComponent();
db = new DB();
}
private void Form(object sender, EventArgs e)
{
//加载Combobox栏中数据
//select CmpName
// from COMPANY
DataTable dataTable = db.getbysql(@"select CmpName from COMPANY");
for(int i = 0;i < dataTable.Rows.Count; i++)
{
for(int j = 0;j < dataTable.Columns.Count; j++)
{
comboBox1.Items.Add(dataTable.Rows[i][j] + "");
}
}
comboBox1.SelectedIndex = 0;
}
private void button1_click(object sender, EventArgs e)
{
if(textBox1.Text == "")
{
MessageBox.Show("请输入想要查询的员工名", this.Text);
}
else
{
/*
select COMPANY.CmpName, t.Salary
from COMPANY,
(select WORKS.CmpNo,WORKS.Salary
from WORKS
where WORKS.EmpNo in (
select EMPLOYEE.EmpNo
from EMPLOYEE
where EMPLOYEE.EmpName = '张三')
) as t
where t.CmpNo = COMPANY.CmpNo
*/
//表头的加载
listView1.Columns.Add("公司名", listView2.Width / 2 - 1,
HorizontalAlignment.Left);
listView1.Columns.Add("薪水", listView2.Width / 2 - 1,
HorizontalAlignment.Left);
DataTable dataTable = db.getbysql(@"select COMPANY.CmpName, t.Salary "
+ "from COMPANY, " + "(select WORKS.CmpNo,WORKS.Salary "
+ "from WORKS " + "where WORKS.EmpNo in ( " + "select EMPLOYEE.EmpNo "
+"from EMPLOYEE "
+ "where EMPLOYEE.EmpName = '"+textBox1.Text+"') " + ") as t "
+ "where t.CmpNo = COMPANY.CmpNo "
);
//加快listview的更新速度
listView1.BeginUpdate();
// 表数据加载至listview
for (int i = 0; i < dataTable.Rows.Count; i++)
{
ListViewItem listViewItem = new ListViewItem();
for (int j = 0; j < dataTable.Columns.Count; j++)
{
if (j <= 0)
{
listViewItem.Text = dataTable.Rows[i][j] + "";
}
else
{
listViewItem.SubItems.Add(dataTable.Rows[i][j] + "");
}
}
listView1.Items.Add(listViewItem);
}
//结束更新
listView1.EndUpdate();
}
}
private void button2_click(object sender, EventArgs e)
{
if(comboBox1.Text != "")
{
listView2.Clear();
/*
select EMPLOYEE.EmpNo, EMPLOYEE.EmpName,COMPANY.CmpName,t.Salary
from EMPLOYEE,
(select WORKS.EmpNo,WORKS.CmpNo,WORKS.Salary
from WORKS
where WORKS.CmpNo in(
select COMPANY.CmpNo
from COMPANY
where COMPANY.CmpName = '晨光科技')) as t,
COMPANY
where EMPLOYEE.EmpNo = t.EmpNo
and t.CmpNo = COMPANY.CmpNo
*/
listView2.Columns.Add("员工号",listView2.Width/4-
1,HorizontalAlignment.Left);
listView2.Columns.Add("员工名", listView2.Width / 4 - 1,
HorizontalAlignment.Left);
listView2.Columns.Add("公司名", listView2.Width / 4 - 1,
HorizontalAlignment.Left);
listView2.Columns.Add("薪水", listView2.Width / 4 - 1,
HorizontalAlignment.Left);
DataTable dataTable = db.getbysql(@"select EMPLOYEE.EmpNo,
EMPLOYEE.EmpName,COMPANY.CmpName,t.Salary "
+ "from EMPLOYEE, "+ "(select WORKS.EmpNo,WORKS.CmpNo,WORKS.Salary "
+ "from WORKS "+ "where WORKS.CmpNo in( "+ "select COMPANY.CmpNo "
+ "from COMPANY "
+ "where COMPANY.CmpName = '"+comboBox1.Text+"')) as t, "+ "COMPANY "
+ "where EMPLOYEE.EmpNo = t.EmpNo "
+ "and t.CmpNo = COMPANY.CmpNo");
listView2.BeginUpdate();
for (int i = 0; i < dataTable.Rows.Count; i++)
{
ListViewItem listViewItem = new ListViewItem();
for(int j = 0; j < dataTable.Columns.Count; j++)
{
if (j <= 0)
{
listViewItem.Text = dataTable.Rows[i][j] + "";
}
else
{
listViewItem.SubItems.Add(dataTable.Rows[i][j] + "");
}
}
listView2.Items.Add(listViewItem);
}
listView2.EndUpdate();
}
else
{
MessageBox.Show("请选择需查询的公司", this.Text);
}
}