数据库基础
SQL 是 Structured Query Language 的缩写,中文译为“结构化查询语言”。SQL 是一种计算机语言,用来存储、检索和修改关系型数据库中存储的数据。
基本概念
1、数据库(DataBase)
- 按照一定数据结构来组织、存储和管理数据的仓库。存储在一起的相关数据的集合。
2、数据库管理系统(DataBase Management System ,DBMS)
- 为管理数据库而设计的一个电脑软件系统。我们用的是微软出的 SQL Server Management Studio
- 分为两种:关系数据库,建立在关系模型基础上的数据库,如SqlServer MySQL Access Oaracle;非关系数据库:不同点,不使用SQL作为查询语言。
3、数据库系统
- 数据库和数据库管理系统组成。
4、sql是大小写不敏感的,但还是大小写分开写比较好
安装
数据库管理系统(database management system,DBMS),Microsoft SQL Server
DBMS是后台运行的一组服务,要与这组服务打交道就需要下载客户端,也就是DBMS客户端,SQL server management studio,SSMS
登录
Server=localhost\SQLEXPRESS;Database=master;Trusted_Connection=True;
前面是服务器名 后面是数据库名字
自己电脑直接这样登录 c# 里面也是这样登录的
开启远程连接
外网可以连接 但是用自己电脑不能连接
1、可以先使用Windows验证登录 将这个勾选上
2、SQL Server配置管理器
3、防火墙
然后重启一下
SQL
数据库管理系统(database management system,DBMS),Microsoft SQL Server
DBMS是后台运行的一组服务,要与这组服务打交道就需要下载客户端,也就是DBMS客户端,SQL server management studio,SSMS
Server=localhost\SQLEXPRESS;Database=master;Trusted_Connection=True;
新建数据库
新建表
设置主键
ctrl s保存
查询语句
select * from t_user where id='1001' and psw='1'
插入数据
那个3和10是int类型 单引号不用也没关系
insert into t_book values('20190101','计算机系统原理','王万森','高等教育出版社','10'),('20190102','机械设计原理','董永','北京教育出版社','3')
select * from t_book
另外一种插入方式,后来又试了一下 不加[]也没关系.好像规范的话 就是要每项都要加[ ]的
insert into t_lend ([uid],bid,name,[datetime]) values('2046','20190101','小明',getdate());
update t_book set number=number-1 where id='20190101'
select *from t_lend
select *from t_book
下面这样设置 就会自增
更新
update t_book set id='111',[name]='高等数学',author='李四',number=100 where id='999'
select * from t_book
当想设置某个表的有个项自增时
删除
delete from t_lend where [no]=5;
update t_book set number=number+1 where id='20190101'
select *from t_lend
select *from t_book
多行查找
多行删除
delete from t_lend where [no] in('6','7')
select *from t_lend
select *from t_book
数据库设计
c#程序设计
Dao.cs
封装了与sql通信的函数
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data.SqlClient;
namespace WindowsFormsApp1
{
class Dao
{
SqlConnection con;
public SqlConnection connect()
{
//数据库连接字符串
//string str = @"Data Source=localhost\SQLEXPRESS;Initial Catalog = BookDB;Integrated_Security=True";//Data Source:服务器的名称;Initial Catalog:数据库的名称
string str = @"Data Source=localhost\SQLEXPRESS;Database = BookDB; Trusted_Connection = True;";//也就是我们安装的时候返回的连接字符串 然后将数据库的名字修改了下
con = new SqlConnection(str);//创建数据库连接对象
con.Open();//打开数据库
return con;//返回数据库连接对象
}
//sql:sql语句
public SqlCommand command(string sql)
{
SqlCommand cmd = new SqlCommand(sql,connect());
return cmd;
}
//更新操作
public int Execute(string sql)
{
return command(sql).ExecuteNonQuery();
}
//读取操作
public SqlDataReader read(string sql)
{
return command(sql).ExecuteReader();//首先执行的是command这个函数 然后返回cmd 再cmd.ExecuteReader()
}
//关闭数据库连接
public void Close()
{
con.Close();
}
}
}
Data.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace WindowsFormsApp1
{
class Data
{
public static string UID = "", UName = "";//登录用户的ID 和姓名
}
}
登录页面
也就是验证输入的数据在t_user和t_admin表中是否存在(需同时满足账户和密码这两项),存在则跳转页面
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
核心代码 登录方法
//登录方法,验证是否允许登录
public void login()
{
//用户
if(UserradioButton1.Checked==true)
{
Dao dao = new Dao();//实例化
//查询语句 拼成这样:select * from t_user where id='1001' and psw='1'
//string sql = "select * from t_user where id='"+ textBox1.Text +"' and psw='"+textBox2.Text+"'";//写法1
//string sql=string.Format("select * from t_user where id='{0}' and psw='{1}'",textBox1.Text,textBox2.Text);//写法2
string sql = $"select * from t_user where id='{textBox1.Text}' and psw='{textBox2.Text}'";//写法3
log.SaveLog(sql);
IDataReader dc = dao.read(sql);
//log.SaveLog(dc[0].ToString()+dc["name"].ToString());//第一行
if (dc.Read())//如果读到一行数据了 就返回真
{
//把值存好
Data.UID = dc["id"].ToString();
Data.UName=dc["name"].ToString();
MessageBox.Show("登录成功");
UserFrm userFrm = new UserFrm();
this.Hide();
userFrm.Show();
}
else
{
MessageBox.Show("登录失败");
}
dao.Close();
}
//管理员
if(AdmiradioButton2.Checked==true)
{
Dao dao = new Dao();//实例化
string sql = $"select * from t_admin where id='{textBox1.Text}' and psw='{textBox2.Text}'";//写法3
log.SaveLog(sql);
IDataReader dc = dao.read(sql);
if (dc.Read())//如果读到一行数据了 就返回真
{
//把值存好
Data.UID = dc["id"].ToString();
// Data.UName=dc["name"].ToString();
MessageBox.Show("登录成功");
//log.SaveLog(dc[0].ToString() + dc["name"].ToString());//第一行
AdminFrm frm= new AdminFrm();
this.Hide();
frm.ShowDialog();
}
else
{
MessageBox.Show("登录失败");
}
dao.Close();
}
//MessageBox.Show("单选框请先选中");
}
登录按钮
private void button1_Click(object sender, EventArgs e)
{
if(textBox1.Text!="" && textBox2.Text!="")
{
login();
}
else
{
MessageBox.Show("输入有空项,请输入");
}
}
管理员主页
主要做一个跳转的作用 然后加入一个关闭回调函数,关闭这个页面就退出程序
public AdminFrm()
{
InitializeComponent();
this.FormClosing += new FormClosingEventHandler(this.NI_FormClosing);
}
private void NI_FormClosing(object sender, FormClosingEventArgs e)
{
Application.Exit();
}
private void 图书管理ToolStripMenuItem_Click(object sender, EventArgs e)
{
BookManageFrm frm = new BookManageFrm();
frm.ShowDialog();
}
图书管理页面
也就是操作t_book中的数据 增加一行 修改一行 删除一行 然后找其中的某一行
获取图书数据函数
//从数据库读取数据显示在表格控件中
public void Fresh()
{
dataGridView1.Rows.Clear();//清空旧数据
Dao dao = new Dao();
string sql = "select * from t_book";
IDataReader dc = dao.read(sql);
string a0,a1, a2,a3, a4,a5;
//dc.Read():一行一行的读 读到没有了就会返回一个false
while (dc.Read())
{
//dataGridView1.Rows.Add(dc[0].ToString(), dc[1].ToString(), dc[2].ToString(), dc[3].ToString(), dc[4].ToString());
//下面这样写和上面这样写 效果是一样的
a0 = dc[0].ToString();
a1 = dc[1].ToString();
a2 = dc[2].ToString();
a3 = dc[3].ToString();
a4 = dc[4].ToString();
string[] table = {a0,a1,a2,a3,a4};
dataGridView1.Rows.Add(table);
}
//关闭 System.Data.IDataReader 对象。
dc.Close();
//关闭数据库连接
dao.Close();
}
根据id查询函数
//根据ID查询
public void InquireId()
{
dataGridView1.Rows.Clear();//清空旧数据
Dao dao = new Dao();
string sql = $"select * from t_book where id='{textBox1.Text}'";
IDataReader dc = dao.read(sql);
string a0, a1, a2, a3, a4, a5;
//dc.Read():一行一行的读 读到没有了就会返回一个false
while (dc.Read())
{
//dataGridView1.Rows.Add(dc[0].ToString(), dc[1].ToString(), dc[2].ToString(), dc[3].ToString(), dc[4].ToString());
//下面这样写和上面这样写 效果是一样的
a0 = dc[0].ToString();
a1 = dc[1].ToString();
a2 = dc[2].ToString();
a3 = dc[3].ToString();
a4 = dc[4].ToString();
string[] table = { a0, a1, a2, a3, a4 };
dataGridView1.Rows.Add(table);
}
//关闭 System.Data.IDataReader 对象。
dc.Close();
//关闭数据库连接
dao.Close();
}
根据书名查询函数
//根据书名查询 模糊查询
public void InquireName()
{
dataGridView1.Rows.Clear();//清空旧数据
Dao dao = new Dao();
string sql = $"select * from t_book where name like '%{textBox2.Text}%'";
IDataReader dc = dao.read(sql);
string a0, a1, a2, a3, a4, a5;
//dc.Read():一行一行的读 读到没有了就会返回一个false
while (dc.Read())
{
//dataGridView1.Rows.Add(dc[0].ToString(), dc[1].ToString(), dc[2].ToString(), dc[3].ToString(), dc[4].ToString());
//下面这样写和上面这样写 效果是一样的
a0 = dc[0].ToString();
a1 = dc[1].ToString();
a2 = dc[2].ToString();
a3 = dc[3].ToString();
a4 = dc[4].ToString();
string[] table = { a0, a1, a2, a3, a4 };
dataGridView1.Rows.Add(table);
}
//关闭 System.Data.IDataReader 对象。
dc.Close();
//关闭数据库连接
dao.Close();
}
BookManageFrm_Load
private void BookManageFrm_Load(object sender, EventArgs e)
{
Fresh();
string id = dataGridView1.SelectedRows[0].Cells[0].Value.ToString();//选中的第0行 第0个单元格 也就是书号(主键)
label2.Text = id + dataGridView1.SelectedRows[0].Cells[1].Value.ToString();//书名+书号
}
添加图书按钮
AddBookFrm frm=new AddBookFrm();
frm.ShowDialog();//打开增加图书页面
Fresh();//刷新页面
修改图书按钮,显示修改图书页面 并肩参数传递进去
try
{
string id= dataGridView1.SelectedRows[0].Cells[0].Value.ToString();//选中的第0行 第0个单元格 也就是书号(主键)
string name = dataGridView1.SelectedRows[0].Cells[1].Value.ToString();//选中的第0行 第0个单元格 也就是书号(主键)
string author = dataGridView1.SelectedRows[0].Cells[2].Value.ToString();//选中的第0行 第0个单元格 也就是书号(主键)
string press = dataGridView1.SelectedRows[0].Cells[3].Value.ToString();//选中的第0行 第0个单元格 也就是书号(主键)
string number = dataGridView1.SelectedRows[0].Cells[4].Value.ToString();//选中的第0行 第0个单元格 也就是书号(主键)
AltBookFrm altBookFrm = new AltBookFrm(id,name,author,press,number);
altBookFrm.ShowDialog();
Fresh();//刷新数据
}
catch
{
MessageBox.Show("error");
}
删除图书
try
{
string id = dataGridView1.SelectedRows[0].Cells[0].Value.ToString();//选中的第0行 第0个单元格 也就是书号(主键)
DialogResult dr=MessageBox.Show("确认删除吗?","信息提示",MessageBoxButtons.OKCancel,MessageBoxIcon.Question);
if(dr==DialogResult.OK)
{
string sql = $"delete from t_book where id='{id}'";
Dao dao =new Dao();
if(dao.Execute(sql)>0)
{
MessageBox.Show("删除成功");
Fresh();
}
else
{
MessageBox.Show("删除失败");
}
dao.Close();
}
}
catch
{
MessageBox.Show("请先在表格选中要删除的图书记录","信息提示",MessageBoxButtons.OK,MessageBoxIcon.Error);
}
刷新
private void button4_Click(object sender, EventArgs e)
{
Fresh();
textBox1.Text = "";
textBox2.Text = "";
}
书号查询和书名查询 调用上面的函数就可以了
private void button5_Click(object sender, EventArgs e)
{
InquireId();
}
private void button6_Click(object sender, EventArgs e)
{
InquireName();
}
多行删除
int n = dataGridView1.SelectedRows.Count;//获取当前选中的行数
string sql = $"delete from t_book where id in (";
for(int i = 0; i < n; i++)
{
sql += $"'{dataGridView1.SelectedRows[i].Cells[0].Value.ToString()}',";
}
sql = sql.Remove(sql.Length - 1);//删除最后一个字符 因为是从0开始计的
sql += ")";
log.SaveLog(sql);
Dao dao = new Dao();
if(dao.Execute(sql)>n-1)//受影响的行数大于n-1
{
MessageBox.Show($"成功删除{n}条图书信息");
Fresh();
}
添加图书页面
添加图书按钮
if(textBox1.Text!=""&& textBox2.Text != "" && textBox3.Text != "" && textBox4.Text != "" && textBox5.Text != "")
{
Dao dao = new Dao();
string sql = $"insert into t_book values('{textBox1.Text}','{textBox2.Text}','{textBox3.Text}','{textBox4.Text}','{textBox5.Text}')";
int n =dao.Execute(sql);
if(n> 0)
{
MessageBox.Show("添加成功");
}
else
{
MessageBox.Show("添加失败");
}
textBox1.Text = "";
textBox2.Text = "";
textBox3.Text = "";
textBox4.Text = "";
textBox5.Text = "";
}
else
{
MessageBox.Show("输入不允许空");
}
清空按钮
textBox1.Text = "";
textBox2.Text = "";
textBox3.Text = "";
textBox4.Text = "";
textBox5.Text = "";
修改图书页面
string ID = "";//登录用户的ID 刚登录的时候就保存在data.cs中
再创建带有参数的构造函数 用来接收传递进来的参数
public AltBookFrm()
{
InitializeComponent();
}
public AltBookFrm(string id,string name,string author,string press,string number)
{
InitializeComponent();
ID =textBox1.Text = id;
textBox2.Text = name;
textBox3.Text = author;
textBox4.Text = press;
textBox5.Text = number;
}
修改按钮
string sql = $"update t_book set id='{textBox1.Text}',[name]='{textBox2.Text}',author='{textBox3.Text}',press='{textBox4.Text}',number={textBox5.Text} where id='{ID}'";
Dao dao = new Dao();
if(dao.Execute(sql)>0)
{
MessageBox.Show("修改成功");
}
用户页面
做一个跳转 关闭这个页面 就关闭应用程序
关闭则退出
public UserFrm()
{
InitializeComponent();
label1.Text = $"欢迎{Data.UName}登录";
this.FormClosing += new FormClosingEventHandler(this.NI_FormClosing);
}
private void NI_FormClosing(object sender, FormClosingEventArgs e)
{
Application.Exit();
}
就是做一个跳转
private void 当前借出图书和归还ToolStripMenuItem_Click(object sender, EventArgs e)
{
UserBookCheckFrm u=new UserBookCheckFrm();
u.Show();
}
private void 图书归还ToolStripMenuItem_Click_1(object sender, EventArgs e)
{
UserBookCondition userc=new UserBookCondition();
userc.Show();
}
查看图书和借阅
实际操作的就是t_lend和t_book这两个页面,t_lend页面增加一行数据,t_book中number数量+1
书号查询和书名查询 在图书管理页面有
刷新
public void Fresh()
{
dataGridView1.Rows.Clear();//清空旧数据
Dao dao = new Dao();
string sql = "select * from t_book";
IDataReader dc = dao.read(sql);
string a0, a1, a2, a3, a4, a5;
//dc.Read():一行一行的读 读到没有了就会返回一个false
while (dc.Read())
{
//dataGridView1.Rows.Add(dc[0].ToString(), dc[1].ToString(), dc[2].ToString(), dc[3].ToString(), dc[4].ToString());
//下面这样写和上面这样写 效果是一样的
a0 = dc[0].ToString();
a1 = dc[1].ToString();
a2 = dc[2].ToString();
a3 = dc[3].ToString();
a4 = dc[4].ToString();
string[] table = { a0, a1, a2, a3, a4 };
dataGridView1.Rows.Add(table);
}
//关闭 System.Data.IDataReader 对象。
dc.Close();
//关闭数据库连接
dao.Close();
}
借出图书按钮
string id = dataGridView1.SelectedRows[0].Cells[0].Value.ToString();//获取书号
string name = dataGridView1.SelectedRows[0].Cells[1].Value.ToString();
int number=int.Parse(dataGridView1.SelectedRows[0].Cells[4].Value.ToString());//库存
if(number<1)
{
MessageBox.Show("库存不足");
}
else
{
string sql = $"insert into t_lend ([uid],bid,name,[datetime]) values('{Data.UID}','{id}','{name}',getdate());update t_book set number=number-1 where id='{id}'";
Dao dao = new Dao();
if(dao.Execute(sql)>1)//因为sql里面包含了两条语句
{
MessageBox.Show($"{Data.UName}借书成功");
Fresh();
}
}
借书情况及归还页面
实际操作的就是t_lend和t_book这两个页面,t_lend页面减少一行数据,t_book中number数量+1
归还
string no = dataGridView1.SelectedRows[0].Cells[0].Value.ToString();
string bookid = dataGridView1.SelectedRows[0].Cells[1].Value.ToString();
string sql = $"delete from t_lend where[no] = {no}; update t_book set number = number + 1 where id = '{bookid}'";
Dao dao = new Dao();
if(dao.Execute(sql)>1)
{
MessageBox.Show("归还成功");
Fresh();
}
刷新
public void Fresh()
{
dataGridView1.Rows.Clear();//清空旧数据
Dao dao = new Dao();
string sql = $"select *from t_lend where [uid]='{Data.UID}'";
IDataReader dc = dao.read(sql);
string a0, a1, a2, a3, a4, a5;
//dc.Read():一行一行的读 读到没有了就会返回一个false
while (dc.Read())
{
//dataGridView1.Rows.Add(dc[0].ToString(), dc[1].ToString(), dc[2].ToString(), dc[3].ToString(), dc[4].ToString());
//下面这样写和上面这样写 效果是一样的
a0 = dc[0].ToString();
a1 = dc[1].ToString();
a2 = dc[2].ToString();
a3 = dc[3].ToString();
a4 = dc[4].ToString();
string[] table = { a0, a2, a3, a4 };
dataGridView1.Rows.Add(table);
}
//关闭 System.Data.IDataReader 对象。
dc.Close();
//关闭数据库连接
dao.Close();
}