C#连接操作MySQL数据库进行添加、修改、删除、查询等操作的演示
鉴于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();
}
}
}
(注意:上面连接字符串中加了一个"Charset=utf8",否则向数据库中插入汉字时,会显示为?符号乱码。)
运行程序,看到已经可以显示数据记录了。效果如下图所示:
前我们现在的数据库表还是空的。下面我们继续实现其他功能。
(二)添加一条用户信息
击“添加”按钮,添加实现代码。
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数据控件绑定数据
}
转存失败重新上传取消
上面代码运行可以正常添加记录。
(三)修改用户记录
我们想实现这样的修改功能:在用户表中对某用户信息进行编辑,编辑完毕后,点击“修改”按钮,直接该条修改保存至数据库中。下面是实现代码:
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("修改失败");
}
转存失败重新上传取消
效果如下:
(四)删除记录
现在我们想实现这样的删除功能,选择列表中的某几行(整行选择,选择某个单元格不算选择),点击“删除”按钮,将记录从列表和数据库中同步删除,实现代码如下:
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()));
}
}
转存失败重新上传取消
(五)查询记录
我们想实现这样的模糊查询,在编辑框中输入某文本,点击“查询”按钮,数据库中的用户信息记录,不管是单位、姓名、还是电话中只要出现该文本,即显示出来。
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数据控件绑定数据
}
六、后记。
至此,各项功能都实现了,代码好写,编辑个博客整了大半天。 代码一并上传至资源中。供大家参考。