《数据库系统概论》学习总结

附件四(数据库实验(ADO.NET实现数据库操作))

(控制台实现)

实现功能:

  1. 创建连接:根据特定的SQL字符串创建MySQLConnection对象,并打开连接
  2. 查询读取数据(两种方式读取):
    2-1. (Command对象)、MySqlDataReader对象方式直接读取,
    2-2. 使用ADO.NET(MySqlDataAdapter,DataSet,DataTable三个类对象)
    3.更新数据:
    3-1 利用Command对象直接进行操作:根据MySQLConnection连接对象创建MySQLCommand操作对象(对数据库进行增删查改等操作)
    3-2 利用Command对象创建事务,利用事务处理单元任务(事务是一组由相关任务组成的单元,该单元中的任务要么全部成功,要么全部失败。若失败,则全部回滚,事务的四个特性(ACID)分别是原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持续性(Durability))
    3-3 利用MySqlDataAdapter,DataSet对象更新数据
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<<endl;(直接写成 Console.WriteLine(dr["学号"] + " " + dr["姓名"]); 就OK) } //关闭连接,关闭MySqlDataReader对象: dr.Close(); */


            // 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
    {
   
        /// <summary>
        /// 应用程序的主入口点。
        /// </summary>
        //[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语句并执行)(执行结果由对话框给出通知)(但是由于是对数据库直接进行操作,风险系数相对较高)

存在疑问:
起初试图尝试建立可移植性数据库可视化界面,即用户输入相关数据库信息后则对数据库信息进行基本展示(已实现)并可直接对该数据库中所选数据表基本信息进行展示(已实现),同时对该数据表进行增删查改的基本操作(未实现,有疑问)。

我们在对数据表进行增删查改时由于字段信息的不确定性,我们无法对数据库进行统一操作,只能通过建立不同的数据库管理对每张单表进行单独操作和处理,这在数据库管理方面是一个非常巨大的工作量,因为用户每操作一张表,都需要写出对应的代码,而没有一个统一的接口对数据库管理进行实现。