实现功能:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data.SqlClient;
using System.Data.Odbc;
using System.Data.OleDb;
using MySql.Data.MySqlClient; //需要到官网下载MySQL的ADO.NET驱动程序并引用MySQL.Data.MySqlClient命名空间
using System.Data; //包含MySqlDataAdapter,DataSet,DataTable三个类
namespace ConsoleApp1
{
class Program
{
//创建command对象
private static MySqlCommand cmd = null;
//创建connection连接对象
private static MySqlConnection conn = null;
public static void Connection()
{
// 1. 创建连接:根据特定的SQL字符串创建MySQLConnection对象,并打开连接
string str = "server=localhost;User Id=root;password=123456mjg;Database=学生成绩管理系统";//连接MySQL的字符串
MySqlConnection test = new MySqlConnection(str);//实例化链接
test.Open();//开启连接
/* 2. 查询读取数据(两种方式读取):
* 2-1. (Command对象)、MySqlDataReader对象方式直接读取,
* 2-2. 使用ADO.NET(MySqlDataAdapter,DataSet,DataTable三个类对象)
*/
// 2-1. 查询读取数据时可直接采用MySqlCommand类对象的ExecuteReader();方法,该方法返回一个MySqlDataReader对象,
//然后通过其Read()方法读取数据,如果读取到数据,则Read()方法返回true,失败或者读取完毕返回false。
//Read()方法读取一条数据后,下一次使用Read()方法会读取下一条数据。因此,使用while语句可以读取所有“查”到的数据
/*
MySqlCommand mycmd = new MySqlCommand("select * from 学生",test);
MySqlDataReader dr;
dr = mycmd.ExecuteReader(); //这里可将DataReader绑定到数据控件中: DataTable dt = new DataTable(); dt.Load(dr); dataGridView1.DataSource = dt;
while (dr.Read())
{
Console.Write(dr["学号"] + " " + dr["姓名"]);
Console.WriteLine(); //控制台写一行,相当于cout<
// 2-2.
/*
MySqlCommand mycmd = new MySqlCommand("select * from 学生", test);
//创建MySqlDataAdapter,DataSet,DataTable三个类对象
MySqlDataAdapter da = new MySqlDataAdapter(mycmd);
DataSet ds = new DataSet();
DataTable dt = new DataTable();
//调用MySqlDataAdapter对象的Fill方法执行SQL语句,并将查询存入DataSet对象中, 对数据库检索后,被取回的数据就存放在DataTable对象中
da.Fill(ds, "test");
dt = ds.Tables["test"];
//从DataTable对象中查询数据:
for (int i = 0; i < dt.Rows.Count; i++)//读取数据
{
Console.WriteLine(dt.Rows[i]["学号"].ToString() + " " + dt.Rows[i]["姓名"].ToString());
}
*/
/*3.更新数据:
* 3-1 利用Command对象直接进行操作:根据MySQLConnection连接对象创建MySQLCommand操作对象(对数据库进行增删查改等操作)
* 3-2 利用Command对象创建事务,利用事务处理单元任务
* 3-3 利用MySqlDataAdapter,DataSet对象更新数据
*/
// 3-1 利用Command对象直接进行操作:根据MySQLConnection连接对象创建MySQLCommand操作对象(对数据库进行增删查改等操作)
/*
MySqlCommand mycmd = new MySqlCommand("insert into 学生(学号,姓名,性别,年级,专业,班级) values(" + 2018 + ",'test','男','18级','计算机','2班')", test);
//第一个参数代表SQL语句,第二个参数为MySqlConnection连接对象
//"+ 2018 +"代表主键(注意格式区别),这里执行插入不能重复执行,因为第一次插入后由于主键的唯一性,第二次执行就会报错
if (mycmd.ExecuteNonQuery() > 0) //可以接受该方法的返回值,返回值为影响的表的行数:int n=mycmd.ExecuteNonQuery();
{
Console.WriteLine("success");
}
else
{
Console.WriteLine("false");
}
*/
// 3-2 创建事务,利用事务处理单元任务:
//事务是一组由相关任务组成的单元,该单元中的任务要么全部成功,要么全部失败。
//若失败,则全部回滚,事务的四个特性(ACID)分别是原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持续性(Durability)。
/*
//数据库连接字符串(新建立的数据库连接)
String connstr = "server=localhost;User Id=root;password=123456mjg;Database=学生成绩管理系统";
//建立数据库连接
using (conn = new MySqlConnection(connstr))
{
conn.Open();
//启动一个事务
using (MySqlTransaction transaction = conn.BeginTransaction())
{
using (cmd = conn.CreateCommand())
{
try
{
cmd.Transaction = transaction; //为命令指定事务
cmd.CommandText = "insert into 学生(学号,姓名,性别,年级,专业,班级) values(" + 4 + ",'test1','男','18级','计算机','2班');"; //注意是完整的SQL语句,后面不要掉;
cmd.ExecuteNonQuery();
cmd.CommandText = "insert into 学生(学号,姓名,性别,年级,专业,班级) values(" + 5 + ",'test1','男','18级','计算机','2班');"; //test:学号为主键,二次插入一定失败,事务便会回滚到初始状态
cmd.ExecuteNonQuery();
transaction.Commit(); //事务提交
Console.WriteLine("执行事务成功!");
}
catch (Exception)
{
transaction.Rollback(); //事务回滚
Console.WriteLine("执行事务失败,已经回滚到初始状态!");
}
finally
{
conn.Close();
}
}
}
}
*/
// 3 - 3 利用MySqlDataAdapter,DataSet对象更新数据:
//数据库连接字符串
String connstr = "server=localhost;User Id=root;password=123456mjg;Database=学生成绩管理系统";
//建立数据库连接(新建立的数据库连接)
conn = new MySqlConnection(connstr);
try
{
string mysqlText = "select * from 学生;";
MySqlDataAdapter mysda = new MySqlDataAdapter(mysqlText, conn);
DataSet ds = new DataSet();
DataTable dt = new DataTable();
mysda.Fill(ds, "comment"); //(这里的comment名称没有限制,与数据库表名无关,是mysda下的组件容器名)
dt = ds.Tables["comment"];
//绑定MySqlDataAdapter对象,自动生成从DataSet更新MySql的命令
//参考文章:C# SqlCommandBuilder的用法:https://blog.csdn.net/om001om/article/details/6256279
MySqlCommandBuilder cb = new MySqlCommandBuilder(mysda);
//更新ds中的数据
dt.Rows[0]["学号"] = 1;
dt.Rows[0]["姓名"] = "test1";
dt.Rows[0]["年级"] = "18级";
//更新数据库中的数据
mysda.Update(ds, "comment");
}
catch (Exception)
{
throw;
}
Console.ReadLine(); //控制台读一行,相当于cin>> 这里作为用来暂停使用
test.Close();//关闭
return;
}
static void Main(string[] args)
{
Connection();
Console.WriteLine("test over");
}
}
}
部分测试结果:
数据库下的学生管理系统的学生表(操作测试之后的)(Navicat下的可视化界面):
略~
当然我们可以直接借助Visual Studio直接连接数据库进行对数据库的可视化操作(可以直接在Visual Studio中运行SQL语句查看结果)(需要提前下载好MySQL for Visual Studio):
略~
改进:
我们对于上述操作还可以采用EF框架(Entity Framework)来连接MySQL及操作,建立实体数据模型之后加载数据库的EF设计框架,测试连接数据库后在框架下执行相关操作(操作更加便捷,但是在此之前需要确保已经安装了Entity Framework Support并且保证MySql.Data,MySql.Data.Enity等包的版本控制问题(使用nuget包版本控制管理工具即可),否则会建立失败)
基本核心代码到此已基本实现,下一步可以将上述对数据库的操作代码进行可视化封装(直接利用Visual Studio下的C#窗口应用程序创建相应组件即可)
语言实现比较:
本实验采用的是C#语言,如果是C++可采用Qt窗口应用程序(C++实现ADO连接数据库个人感觉真的有些复杂,甚至还要借助VC++等IDE实现,需要对相关资源进行预处理和回收等工作,操作感觉并不友好)
Java语言对于数据库的连接基本都是采用JDBC等方式进行连接或者采用新型的架构去替代JDBC,对于可视化界面可采用awt, swing等进行组件的创建
(C#窗体应用设计,ADO.NET操作实现)
上次采用的是控制台实现数据库基本操作(增删查改),这次采用窗口可视化通过控件的方式对数据库的数据信息进行展示(DataGridView)和基本操作。
具体实现功能:
1.登录界面:
通过用户输入服务器地址(本地采用localhost)、用户名、密码、所连数据库名称进行对数据库的连接。
对于未输入信息的情况给出提示:
验证失败或成功后给出提示(成功后自动登录显示操作界面):
此时后台进行创建连接:根据特定的SQL字符串创建MySQLConnection对象,并打开连接,然后隐藏第一个界面,跳转到第二个界面。
2.数据的展示、操作界面:略~
2-1.通过show tables;命令展示该数据库下所有数据表(初始化时完成)。
2-2.通过输入数据库的相关数据表展示数据表下的所有数据和字段名、字段类型、主键等相关信息。
2-3.模糊查询:
输入数据表内相关信息即可进行模糊查询,查找到的相关信息将会通过第三个datagridview展示出来:
2-3.增加一条新数据(在控件内输入一条合法数据即可进行添加并提示添加成功,此时在datagridview中将展示新添加的数据,刷新数据表即可看到我们新插入的数据)(如果存在主键重复或格式错误等信息将提示添加失败):
2-4.修改(更新)数据:
同增加数据。
2-5.删除数据:
输入学生学号后即可删除
2-6.删除数据(仅对datagridview进行表面删除)(不涉及数据库删除)(支持多行删除等操作)
代码实现:
Programs(代码入口):
using System.Windows.Forms;
namespace 连接数据库_窗体应用程序_
{
static class Program
{
///
/// 应用程序的主入口点。
///
//[STAThread]
static void Main(string[] args)
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Login login = new Login();
Application.Run(login);
}
}
}
Form1(登录界面):
using MySql.Data.MySqlClient;
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;
namespace 连接数据库_窗体应用程序_
{
public partial class Login : Form
{
public Login()
{
InitializeComponent();
}
public bool TestLogin(String server,String userid,String password,String database)
{
if (server == "")
{
MessageBox.Show("请输入服务器地址!", "登陆失败!", MessageBoxButtons.OK, MessageBoxIcon.Error);
return false;
}
else if (userid == "")
{
MessageBox.Show("请输入用户名!", "登陆失败!", MessageBoxButtons.OK, MessageBoxIcon.Error);
return false;
}
else if (password == "")
{
MessageBox.Show("请输入密码!", "登陆失败!", MessageBoxButtons.OK, MessageBoxIcon.Error);
return false;
}
else if (database == "")
{
MessageBox.Show("请输入要连接的数据库名称!", "登陆失败!", MessageBoxButtons.OK, MessageBoxIcon.Error);
return false;
}
return true;
}
public static MySqlConnection TestConnection(String server, String userid, String password, String database)
{
try
{
Console.WriteLine(@server + userid + @password + @database);
// 1. 创建连接:根据特定的SQL字符串创建MySQLConnection对象,并打开连接
//string str = "server=localhost;User Id=root;password=123456mjg;Database=学生成绩管理系统";//连接MySQL的字符串
string str = "server=localhost;User Id=root;password='" + password + "';Database='" + database + "'";
MySqlConnection test = new MySqlConnection(str);//实例化链接
test.Open();//开启连接
return test; //返回连接对象test/null以替代bool的true/false,以便下面可以继续操作该连接对象
//输入相关数据后查找用户如果存在则登陆成功反之则失败,但是局限性太高,只能选择确定的数据库(更换数据库需要修改相关数据)(本质是根据相关数据信息登录后查用户表(Select * from user))
/*string sql = "Select * from user where id='" + userid + "' and pwd='" + password + "'";//查找用户sql语句
MySqlCommand cmd = new MySqlCommand(sql, TestConnection);
cmd.CommandType = CommandType.Text;
MySqlDataReader dr;
dr = cmd.ExecuteReader();
if (dr.Read()) //从结果中找到
{
MessageBox.Show("登录成功", "提示");
}
else
{
MessageBox.Show("用户名或密码错误", "提示");
}*/
}
catch
{
Console.WriteLine("登陆失败");
return null;
}
}
private void button1_Click(object sender, EventArgs e)
{
//Program.Connection();
//首先排除非法输入(未输入信息,输入信息不符合格式)等情况,这里以未输入信息为例
String server=ServerBox.Text.Trim();
String userid=UserIDBox.Text.Trim();
String password=PasswordBox.Text.Trim();
String database = DatabaseBox.Text.Trim();
if (TestLogin(server,userid,password,database)) //登陆失败时:信息输入错误导致不能连接数据库
{
MySqlConnection connection = new MySqlConnection();
connection = TestConnection(server, userid, password, database);
if (connection==null) //没有获取到连接对象时
MessageBox.Show("您输入的信息有误,请检查后重新输入!", "登陆失败!", MessageBoxButtons.OK, MessageBoxIcon.Error);
else
{
MessageBox.Show("欢迎登陆!", "登陆成功!");
this.Hide(); //这里只是隐藏界面,实际还在运行中
string sql = "show tables;"; //这里显示所有的数据表数据,便于用户操作数据表(实际在最初的位置也可以显示所有的数据库)
MySqlCommand cmd = new MySqlCommand(sql, connection);
MySqlDataReader reader = cmd.ExecuteReader();//执行ExecuteReader()返回一个MySqlDataReader对象
Form2 f2 = new Form2(reader,connection); //这里只是显示数据表,具体操作哪张数据表让用户在Form2中进行手动,而不是限制死 另外把connection数据库连接传过去,便于操作(实际应该只传连接对象,初始化的reader数据操作放在Form2中进行)
reader.Close();
//connection.Close(); //关闭原数据连接
f2.ShowDialog();
//Close是关闭窗口句柄,Dispose是关闭窗口句柄以后同时释放内存资源
//c# 里this.close() 和 this.dispose () 到底有什么区别:https://zhidao.baidu.com/question/275018893.html
//this.Close();
this.Dispose(); //一定要记得关闭/释放资源否则该程序会一直运行
}
}
Console.WriteLine("TestConnection over");
}
}
}
Form2(数据库操作展示界面):
using MySql.Data.MySqlClient;
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;
namespace 连接数据库_窗体应用程序_
{
public partial class Form2 : Form
{
private MySqlConnection connection = new MySqlConnection();
public Form2()
{
InitializeComponent();
}
public Form2(MySqlDataReader reader, MySqlConnection connection)
{
InitializeComponent();
this.settabledata(reader); //对dataGridView初始化 显示该数据库下的所有数据表
this.connection = connection; //对数据库的连接进行初始化,确定所选中的数据库连接,便于操作
}
private void tableLayoutPanel1_Paint(object sender, PaintEventArgs e)
{
}
private void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e)
{
}
private void Form2_Load(object sender, EventArgs e)
{
}
//对dataGridView初始化:
//显示数据表的属性信息,如字段名,字段类型,主键等(采用DataReader读取并直接填充)(不可更改)
public void settabledata(MySqlDataReader reader)
{
//this.dataGridView1.DataSource = ds.Tables[0].DefaultView;//表从起始行显示在dataGridView里
//this.dataGridView1.DataSource = reader.GetSchemaTable(); //是否有一种实现可以像DataSet一样把表的内容全部展示出来:
//直接通过DataReader填充DataGridView:
BindingSource bs = new BindingSource();
bs.DataSource = reader;
this.dataGridView1.DataSource = bs;
/*while (reader.Read())
{
int index = this.dataGridView1.Rows.Add();
this.dataGridView1.Rows[index].Cells[0].Value = reader.GetString("学号");
this.dataGridView1.Rows[index].Cells[1].Value = reader.GetString("姓名");
this.dataGridView1.Rows[index].Cells[2].Value = reader.GetString("性别");
this.dataGridView1.Rows[index].Cells[3].Value = reader.GetString("专业");
}*/
}
//显示数据表信息,用DataSet读取,可作修改
public void setdata(String sql, DataGridView dgv)
{
try
{
MySqlCommand cmd = new MySqlCommand(sql, connection);
DataTable dt = new DataTable();
MySqlDataAdapter mysda = new MySqlDataAdapter(cmd);
DataSet ds = new DataSet();
mysda.Fill(ds);
dgv.DataSource = ds.Tables[0];
//mysda.Update(ds);
}
catch (Exception)
{
MessageBox.Show("操作失败!", "操作失败!", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private void button1_Click(object sender, EventArgs e)
{
String table = query.Text.Trim();
Console.WriteLine(table);
if (table == "")
{
MessageBox.Show("您未输入要查询的表名!", "提示!");
}
else
{
try
{
string sql = "show full fields from " + table + ""; //展示所有信息
string sql1 = "select * from " + table + "";
//string sql = "select column_comment,column_name,data_type character_maximum_length,column_key from information_schema.columns where table_schema='学生成绩管理系统' and table_name='" + table + "'";
this.setdata(sql, dataGridView2);
this.setdata(sql1, dataGridView3);
//设置表头信息:
/*for(int i = 0; i < dataGridView3.Columns.Count; i++)
{
dataGridView3.Columns[i].HeaderCell.Value = "1";
}*/
}
catch
{
MessageBox.Show("您输入的表名有误,请检查后重新输入!", "错误!", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
}
private void button2_Click(object sender, EventArgs e)
{
int row = dataGridView3.SelectedRows.Count;
if (row == 0)
{
MessageBox.Show("没有选中任何行", "Error");
return;
}
else if (MessageBox.Show("确认删除选中的" + row.ToString() + "条记录吗?", "请确认", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
{
try
{
for (int i = 0; i < dataGridView3.SelectedRows.Count; i++)
{
dataGridView3.Rows.Remove(dataGridView3.SelectedRows[i]);//有时会报错,显示:索引超出范围。必须为非负值并小于集合大小。
//dataGridView3.Rows.RemoveAt(dataGridView3.SelectedRows[i].Index);//语句也可以这样写
i--;
}
}
catch (Exception)
{
MessageBox.Show("不可删除空行");
}
}
}
private void button3_Click(object sender, EventArgs e)
{
/*//根据字段来插入不确定数据表的不确定性和繁琐性
String s = "insert into "+connection.Database+"( ";
for (int i = 0; i < dataGridView3.Columns.Count; i++)
{
Console.WriteLine(dataGridView3.Columns[i].HeaderCell.Value);
Console.WriteLine(dataGridView3.Rows[0].Cells[i].Value.ToString());
Console.WriteLine(connection.Database);
s = s + "'"+ dataGridView3.Columns[i].HeaderCell.Value +"',";
}
s = s + ")values(";
for (int i = 0; i < dataGridView3.Columns.Count; i++)
{
s = s + "'"+dataGridView3.Rows[0].Cells[i].Value.ToString()+"',";
}
s = s + ");";
Console.WriteLine(s); //insert into 学生成绩管理系统( '学号','姓名','性别','年级','专业','班级',)values('1','test0','男','18级','计算机','2班',); //还需要改:例如最后一个逗号(循环读取时将count改为count-1后再读取最后一位即可实现,但是由于字段类型的限制,符号" ' "不能确定是否有无,如果挨个判断将会变得十分繁琐,因此对这种操作进行放弃*/
try
{
//改用确定的字段对确定的数据表进行操作:
MySqlCommand mycmd = new MySqlCommand("insert into 学生(学号, 姓名, 性别, 年级, 专业, 班级)values(" + 10 + ", 'test00', '男', '18级', '计算机', '2班')", connection);
/* MySqlCommand mycmd = new MySqlCommand("insert into 学生(学号,姓名,性别,年级,专业,班级) values(" + 18 + ",'test','男','18级','计算机','2班')", connection);*/
}
catch (Exception)
{
Console.WriteLine("false");
}
Console.WriteLine("success");
}
private void select_button_Click(object sender, EventArgs e)
{
String str = select_text.Text.ToString();
if (str == "")
{
select_text.Text = "请输入您要查询的信息";
return;
}
String sql = "select * from 学生 where 学号 like '%"+str+"%' or 姓名 like '%"+str+"%' or 性别 like '%" +str+ "%' or 年级 like '%" + str + "%' or 专业 like '%" + str + "%' or 班级 like '%" + str + "%'";
setdata(sql, dataGridView2);
}
private void add_button_Click(object sender, EventArgs e)
{
String no = add_no.Text.ToString();
String name = add_name.Text.ToString();
String sex = add_sex.Text.ToString();
String nianji = add_nianji.Text.ToString();
String zhuanye = add_zhuanye.Text.ToString();
String banji = add_banji.Text.ToString();
if (no == "")
{
MessageBox.Show("请输入学号!");
return;
}
String sql = "insert into 学生(学号, 姓名, 性别, 年级, 专业, 班级)values('" + no + "','" + name + "','" + sex + "','" + nianji + "','" + zhuanye + "','" + banji + "')";
try
{
MySqlCommand cmd = new MySqlCommand(sql, connection);
MySqlDataAdapter mysda = new MySqlDataAdapter(cmd);
DataSet ds = new DataSet();
mysda.Fill(ds);
}
catch (Exception)
{
MessageBox.Show("添加失败!", "添加失败!", MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
MessageBox.Show("添加成功");
string sql1 = "select * from 学生 where 学号='"+ no+"'";
setdata(sql1, dataGridView2);
}
private void update_button_Click(object sender, EventArgs e)
{
String no = update_no.Text.ToString();
String name = update_name.Text.ToString();
String sex = update_sex.Text.ToString();
String nianji = update_nianji.Text.ToString();
String zhuanye = update_zhuanye.Text.ToString();
String banji = update_banji.Text.ToString();
if (no == "")
{
MessageBox.Show("请输入学号!");
return;
}
String sql = "update 学生 set 学号='"+no+"',姓名='"+name+"',性别='"+sex+"',年级='"+nianji+"',专业='"+zhuanye+"',班级='"+banji+"' where 学号='"+no+"'";
try
{
MySqlCommand cmd = new MySqlCommand(sql, connection);
MySqlDataAdapter mysda = new MySqlDataAdapter(cmd);
DataSet ds = new DataSet();
mysda.Fill(ds);
}
catch (Exception)
{
MessageBox.Show("更新失败!", "更新失败!", MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
MessageBox.Show("更新成功");
string sql1 = "select * from 学生 where 学号='" + no+"'";
setdata(sql1, dataGridView2);
}
private void delete_button_Click(object sender, EventArgs e)
{
String no = delete_no.Text.ToString();
if (no == "")
{
MessageBox.Show("请输入学号!");
return;
}
String sql = "delete from 学生 where 学号='" + no+"'";
try
{
MySqlCommand cmd = new MySqlCommand(sql, connection);
MySqlDataAdapter mysda = new MySqlDataAdapter(cmd);
DataSet ds = new DataSet();
mysda.Fill(ds);
}
catch (Exception)
{
MessageBox.Show("删除失败!", "删除失败!", MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
MessageBox.Show("删除成功");
}
}
}
改进:
我们还可以对数据库可视化界面加一条高级操作(由用户输入SQL语句并执行)(执行结果由对话框给出通知)(但是由于是对数据库直接进行操作,风险系数相对较高)
存在疑问:
起初试图尝试建立可移植性数据库可视化界面,即用户输入相关数据库信息后则对数据库信息进行基本展示(已实现)并可直接对该数据库中所选数据表基本信息进行展示(已实现),同时对该数据表进行增删查改的基本操作(未实现,有疑问)。
我们在对数据表进行增删查改时由于字段信息的不确定性,我们无法对数据库进行统一操作,只能通过建立不同的数据库管理对每张单表进行单独操作和处理,这在数据库管理方面是一个非常巨大的工作量,因为用户每操作一张表,都需要写出对应的代码,而没有一个统一的接口对数据库管理进行实现。