zoukankan      html  css  js  c++  java
  • 《数据库系统概论》学习总结——附件四(数据库实验(ADO.NET实现数据库操作))

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

    附件四(数据库实验(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语句并执行)(执行结果由对话框给出通知)(但是由于是对数据库直接进行操作,风险系数相对较高)

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

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

    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须在文章页面给出原文链接,否则保留追究法律责任的权利。
  • 相关阅读:
    前后端交互, 安装drf, restful接口规范, pycharm断点调试
    django中文设置, axios, CORS, 全局js配置, Vue配置jq + bs
    js原型, Vue项目环境搭建, Vue项目目录结构, Vue项目生命周期, 小组件使用, 全局样式, 路由跳转, 组件的生命周期钩子, 路由传参
    Vue组件
    Vue表单指令, 条件指令, 循环指令, 成员
    question1 赋值运算操作符
    CH15 面向对象程序设计
    CH12 动态内存
    CH11 关联容器
    CH10 泛型算法
  • 原文地址:https://www.cnblogs.com/study-hard-forever/p/14387322.html
Copyright © 2011-2022 走看看