鉴于MySQL数据库的流行与强大,决定多学习使用。现本着学习的目的,将c#访问操作MySQL数据库进行添加、删除、修改、显示等操作进行梳理。以Visual Studio 2012平台下的示例形式写下来,供以后查看。

一、新建一个Windows 窗体应用程序Test。

如下图所示:

二、添加对MySql.Data.dll的引用

如下图所示:

三、主要功能设计

计划实现一个用户表的访问,用户表简单的包含:单位、姓名、联系方式3项内容。提供添加、修改、删除用户功能,同时,为了测试MySQL数据库的访问性能,提供批量数量添加测试功能,如批量添加10000个用户,看看数据库的执行效率。界面作如下布局:

四、数据库设计

打开MySQL WorkBench创建数据库test,SQL代码如下:

CREATE Database `test` DEFAULT CHARACTER SET utf8 ;

创建数据库表user,SQL代码如下:

CREATE TABLE `user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `unit` varchar(45) DEFAULT NULL,
  `name` varchar(45) DEFAULT NULL,
  `phone` varchar(45) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

五、c#编程实现数据库访问的各项操作

前面已经添加了MySql.Data.dll的引用,在连接MySQL数据库之前,还要在编程前添加对using MySql.Data.MySqlClient的引用;如下打开Form1.cs添加带注释的那行代码:

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;
using MySql.Data.MySqlClient;//添加对MySql.Data.MySqlClient的引用。

namespace Test
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
    }
}

现在准备工作完毕,可以正式编程实现MySQL数据库的访问操作了

(一)建立数据库连接,并显示数据

定义数据库连接相关变量和对象。

双击Form1设计界面,重载Form1_Load函数。

为Form1类添加MySQL操作需要的变量。并在Form1_Load函数中进行数据库连接,加载用户表中的数据进行显示。在Form1.Close()函数中,关闭数据库连接。代码如下:

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;
using MySql.Data.MySqlClient;//添加对MySql.Data.MySqlClient的引用。

namespace Test
{
    public partial class Form1 : Form
    {
        MySqlConnection conn;//定义数据库连接
        MySqlCommand cmd = new MySqlCommand();//定义数据库执行操作类
        MySqlDataAdapter adapter;

        DateTime dtStart;//用于在批量添加测试时,记录添加数据库记录的开始时间
        DateTime dtEnd;//用于在批量添加测试时,记录添加数据库记录的结束时间
        private int sum = 0;//用于在批量添加测试时,记录要添加数据库记录的总数

        public Form1()
        {
            InitializeComponent();
        }

        
        private void Form1_Load(object sender, EventArgs e)
        {
           // String sqlConn = "server=10.0.0.3;port=3306;user=root;password=licoo1128;database=test;";//定义连接字符串
            String sqlConn = "server=10.0.0.3;port=3306;user=root;password=licoo1128;database=test;Charset=utf8;";//定义连接字符串,Charset=utf8使可以填充中文字符不出现乱码
            conn = new MySqlConnection(sqlConn);//
            conn.Open();
            try
            {
                cmd.Connection = conn;
                adapter = new MySqlDataAdapter("select * from user", conn);
                DataSet ds = new DataSet();
                adapter.Fill(ds);//填充数据至ds数据集
                bindingSource1.DataSource = ds.Tables[0];//绑定数据
                bindingNavigator1.BindingSource = bindingSource1;//为导航控件绑定数据
                dataGridView1.DataSource = bindingSource1;//为DataGridView数据控件绑定数据
                dataGridView1.Columns[0].ReadOnly = true;//设置第1列,即id列不可编辑
            }
            catch (MySqlException ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

        private void Form1_FormClosed(object sender, FormClosedEventArgs e)
        {
            conn.Close();
        }
    }
}
wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==uploading.4e448015.gif转存失败重新上传取消 wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

 

(注意:上面连接字符串中加了一个"Charset=utf8",否则向数据库中插入汉字时,会显示为?符号乱码。)

运行程序,看到已经可以显示数据记录了。效果如下图所示:

wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==uploading.4e448015.gif转存失败重新上传取消wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

前我们现在的数据库表还是空的。下面我们继续实现其他功能。

(二)添加一条用户信息

击“添加”按钮,添加实现代码。

        private void btnAdd_Click(object sender, EventArgs e)
        {
            cmd.CommandText = string.Format("INSERT INTO test.user(unit,name,phone) values('{0}','{1}','{2}');", tbUnit.Text, tbName.Text, tbPhone.Text);
            if (cmd.ExecuteNonQuery() > 0)
                MessageBox.Show("添加成功");
            else
                MessageBox.Show("添加失败");
            adapter = new MySqlDataAdapter("select * from user", conn);
            DataSet ds = new DataSet();
            adapter.Fill(ds);//填充数据至ds数据集
            bindingSource1.DataSource = ds.Tables[0];//绑定数据
            bindingNavigator1.BindingSource = bindingSource1;//为导航控件绑定数据
            dataGridView1.DataSource = bindingSource1;//为DataGridView数据控件绑定数据
        }
wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==uploading.4e448015.gif转存失败重新上传取消 wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

上面代码运行可以正常添加记录。

(三)修改用户记录

我们想实现这样的修改功能:在用户表中对某用户信息进行编辑,编辑完毕后,点击“修改”按钮,直接该条修改保存至数据库中。下面是实现代码:

        private void btnModify_Click(object sender, EventArgs e)
        {
            DataGridViewRow dgr=dataGridView1.CurrentRow;//获取当前编辑的行
            cmd.CommandText = string.Format("UPDATE user SET unit='{0}',name='{1}',phone='{2}' WHERE id='{3}';",
                dgr.Cells[1].Value.ToString(),
                dgr.Cells[2].Value.ToString(), 
                dgr.Cells[3].Value.ToString(), 
                dgr.Cells[0].Value.ToString());
            if (cmd.ExecuteNonQuery() > 0)
                MessageBox.Show("修改成功");
            else
                MessageBox.Show("修改失败");        
        }
wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==uploading.4e448015.gif转存失败重新上传取消 wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

效果如下:

wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==uploading.4e448015.gif转存失败重新上传取消wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

(四)删除记录

现在我们想实现这样的删除功能,选择列表中的某几行(整行选择,选择某个单元格不算选择),点击“删除”按钮,将记录从列表和数据库中同步删除,实现代码如下:

        private void btnDelete_Click(object sender, EventArgs e)
        {
            foreach(DataGridViewRow dgr in dataGridView1.SelectedRows)
            {
                cmd.CommandText = string.Format("DELETE FROM user WHERE id='{0}';",dgr.Cells[0].Value.ToString());
                if (cmd.ExecuteNonQuery() > 0)
                    dataGridView1.Rows.Remove(dgr);//如果成功从数据中删除了记录,则从列表中同步删除。
                else
                    MessageBox.Show(string.Format("从数据库中删除id为{0}的记录失败", dgr.Cells[0].Value.ToString()));
            }
        }
wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==uploading.4e448015.gif转存失败重新上传取消 wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

(五)查询记录

我们想实现这样的模糊查询,在编辑框中输入某文本,点击“查询”按钮,数据库中的用户信息记录,不管是单位、姓名、还是电话中只要出现该文本,即显示出来。

        private void btnFind_Click(object sender, EventArgs e)
        {
            string sql = string.Format("select * from user where unit like '%{0}%' or name like '%{0}%' or phone like '%{0}%';", tbInfo.Text);
            adapter = new MySqlDataAdapter(sql, conn);
            DataSet ds = new DataSet();
            adapter.Fill(ds);//填充数据至ds数据集
            bindingSource1.DataSource = ds.Tables[0];//绑定数据
            bindingNavigator1.BindingSource = bindingSource1;//为导航控件绑定数据
            dataGridView1.DataSource = bindingSource1;//为DataGridView数据控件绑定数据
            dataGridView1.Columns[0].ReadOnly = true;//设置第1列,即id列不可编辑
        }

(六)批量添加数据

为了测试MySQL数据库的sql语句执行效率,我加入了这个批量添加功能,进行大数据量的执行速度测试,并实时显示执行进度。为此为Form1窗体添加异步执行控件BackgroundWorking控件对象backgroundWorker1。设置WorkerReportsProgress属性为true,并添加异步处理事件,如下:

添加代码如下:

        private void btnBulkAdd_Click(object sender, EventArgs e)
        {
            if (backgroundWorker1.IsBusy)
                return;
            sum = Convert.ToInt32(tbSum.Text);
            backgroundWorker1.RunWorkerAsync();//执行后台异步操作,写入数据库
            progressBar1.Maximum = sum;
            progressBar1.Value = 0;
            progressBar1.Step = 1;
        }

        private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
        {
            dtStart = DateTime.Now;
            BackgroundWorker worker = sender as BackgroundWorker;

            for (int i = 0; i < sum; i++)
            {
                cmd.CommandText = string.Format("INSERT INTO user (unit, name, phone) VALUES ('南京{0}', '徐{0}', '18012341234');", i);
                cmd.ExecuteNonQuery();
                worker.ReportProgress(i);
            }
        }

        private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            labelSum.Text = string.Format("已添加{0}条记录", (e.ProgressPercentage + 1).ToString());
            progressBar1.Value++;
        }

        private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            dtEnd = DateTime.Now;
            TimeSpan ts = dtEnd - dtStart;
            string sInfo = string.Format("添加完毕!用时:{0}天{1}小时{2}分{3}秒{4}毫秒", ts.Days, ts.Hours, ts.Minutes, ts.Seconds, ts.Milliseconds);
            MessageBox.Show(sInfo);
            cmd.Connection = conn;
            MySqlDataAdapter adp = new MySqlDataAdapter("select * from user", conn);
            DataSet ds = new DataSet();
            adp.Fill(ds);
            bindingSource1.DataSource = ds.Tables[0];
            bindingNavigator1.BindingSource = bindingSource1;
            dataGridView1.DataSource = bindingSource1;
        }

执过程如下:

执行完毕后提示执行时间,如下图所示:

可以看到单个后台进程执行插入10000条数据库记录用了21秒多。MySQL的执行效率还是很高的。

(七)清空数据库

测试数据太多了,我们添加一个清空数据库功能。代码如下:

        private void btnClearAll_Click(object sender, EventArgs e)
        {
            cmd.CommandText = string.Format("delete from test.user");
            if (cmd.ExecuteNonQuery() > 0)
                MessageBox.Show("清空数据库成功");
            else
                MessageBox.Show("操作失败");
            adapter = new MySqlDataAdapter("select * from user", conn);
            DataSet ds = new DataSet();
            adapter.Fill(ds);//填充数据至ds数据集
            bindingSource1.DataSource = ds.Tables[0];//绑定数据
            bindingNavigator1.BindingSource = bindingSource1;//为导航控件绑定数据
            dataGridView1.DataSource = bindingSource1;//为DataGridView数据控件绑定数据
        }

六、后记。

至此,各项功能都实现了,代码好写,编辑个博客整了大半天。 代码一并上传至资源中。供大家参考。

更多推荐