[C#] WinFormWPF 实现数据库连接与操作(MySQL)
作者:mmseoamin日期:2023-12-14

目录

🌿前言

🌿MySQL数据库简介

🌿数据库的基本概念

🌿ADO.NET体系结构

  • 数据提供程序(.NET Framework Data Provider)
  • 程序数据集(DataSet)

    🌿数据库的访问形式

    🌿数据库的连接

    🌿实现增查改删(CRUD)操作

    • CRUD SQL常用语句
    • 程序实现数据读取操作
    • 程序实现增删改操作

🌿前言

数据库的使用在涉及或以信息管理为主的软件设计中是不可或缺的一部分。开发人员需要了解数据库基本概念,熟系对数据库的使用,包括基本的可视化软件管理,SQL语句命令操作。为实现窗体软件(WinForm/WPF)对数据库进行读取和写入操作,需要先了解数据库的访问形式,了解ADO.NET结构,掌握使用程序对数据库进行连接实现,能够对数据库进行增删查改操作。本文从数据库的基本使用,到使用程序实现增删查改操作,借助.NET API文档理解相关数据库操作类,完整介绍WinForm/WPF实现数据库连接与操作的方法。[注:本文多以个人理解与应用测试角度编写,如有表达不妥或结构错误的部分,欢迎批评指正。]

🌿MySQL数据库简介

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一。2006年,Oracle收购InnoDB引擎,这深刻影响了后来MySQL的发展——因为MySQL被卖身两次后归于Oracle麾下。2008年,瑞典MySQLAB公司被Sun收购。次年,Sun被Oracle收购,MySQL数据库被一并纳入Oracle,进入OracleMySQL时代。2010年发布的MySQL5.5版本中,将其默认的存储引擎由MyISAM更换为InnoDB。

🌿数据库的基本概念

比较普遍的定义是,数据库(Database,DB)是一个长期储存在计算机内的、有组织、有共享、统一管理的数据集合。数据库的基本组成包括字段、记录、数据表、数据库和主键。

字段Field二维表中的列,描述关系的属性特征
记录Record二维表中的行
数据表Table没有重复的行列构成的关系表
数据库Database多个相关联数据表的集合
主键Key

能够唯一标识不同记录的单个或多个字段的组合

🌿ADO.NET体系结构

.NET编程环境中优先使用数据访问接口ADO.NET提供了平台互用性和可伸缩的数据访问。ADO.NET 提供对诸如 SQL Server 和 XML 这样的数据源以及通过 OLE DB 和 ODBC 公开的数据源的一致访问。 共享数据的使用方应用程序可以使用 ADO.NET 连接到这些数据源,并可以检索、处理和更新其中包含的数据。

[C#] WinFormWPF 实现数据库连接与操作(MySQL),第1张
ADO.NET体系结构图

数据提供程序(.NET Framework Data Provider)

Connection:数据连接类,建立与数据源的连接

Command:数据命令类,使用SQL语句对数据源执行操作命令,用于修改数据、查询数据、运行存储过程,其中,Parameter为参数,参数前面有一个“@”符号,表示它将被视为参数

DataReader:数据读取类,用于从数据源读取数据流

DataAdapter:数据流转类,Fill()方法将数据源数据填充至“内存”数据集DataSet,Update()方法将数据集中的数据更新至数据源中

程序数据集(DataSet)

实现独立于任何数据源的断开式数据访问,其包含任意多个数据表(DataTable)

🌿数据库的访问形式

非断开式:持续保持连接,直到执行关闭命令,占用连接资源,数据更新及时

断开式:数据完成读取/更新后立即断开,执行效率高,占用时间短,数据更新不及时

🌿数据库的连接

使用Connection对象实现数据库的连接,其提供Open()方法进行数据库的连接,Close()方法断开连接。编写连接语句,将其作为参数传入Connection类的构造方法中。对于使用MySQL数据库时,可以先使用NuGet包管理器对项目安装MySql.Data的资源包,并引用相关命名空间。

using MySql.Data.MySqlClient;
private void ConnectionDatabase()
{
    string conStr = "server=localhost;user id=root;password=123456;database=studentmanage";
    MySqlConnection con = new MySqlConnection(conStr);
    con.Open();
    MessageBox.Show("数据库连接成功!");
    con.Close();
}

在具体使用时,要根据自己在安装MySQL时的相关配置,输入对应的账号密码。为了保证封装特性以及设计模式中的开闭原则,我们通常将数据库的连接语句写在配置文件中,后期对软件的使用修改时只需操作配置文件即可,无需修改原有代码。对于配置文件,我们需要向其中加入键值对。



	
		
	

调用相关命名空间后,在方法中我们读取配置文件中的键值。

using System.Configuration;
MySqlConnection conn=null;
string connStr = ConfigurationManager.ConnectionStrings["ConStr"].ConnectionString;
conn = new MySqlConnection(connStr);
conn.Open();

在大型项目中,我们一般定义一个类,专门用于实现对数据库的连接和操作,在该类中设置一个Connection属性,每当调用到该属性时,就自动实现对数据库的连接。

using MySql.Data.MySqlClient;
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace LibraryManage
{
    internal class DBOper
    {
        private static MySqlConnection conn;
        //Connection属性,调用时建立对数据库的连接
        public static MySqlConnection Connection
        {
            get
            {
                //无Connection对象时
                if (conn == null)
                {
                    string connStr = ConfigurationManager.ConnectionStrings["ConStr"].ConnectionString;
                    conn = new MySqlConnection(connStr);
                    conn.Open();
                }
                //Connection对象关闭连接时
                else if (conn.State==System.Data.ConnectionState.Closed) 
                {conn.Close(); }
                //Connection对象断开连接时
                else if (conn.State == System.Data.ConnectionState.Broken)
                {conn.Close(); conn.Open(); }
                return conn;
            }
        }
    }
}

🌿实现增查改删(CRUD)操作

对于数据库的操作,一般掌握顺序是查增改删,下面均以这个顺序介绍CRUD SQL常用语句与程序实现CRUD的操作步骤。

CRUD SQL常用语句

CRUD SQL 常用语句
读取

Read

select <字段列表> from <表或视图> where <查询条件>;基本查询语句
select * form <表>;查询整表(“*”通配符查询所有字段)
select <字段列表> from <表>;查询指定字段
select <字段列表> from <表> where <字段> in (<取值列表>);多取值条件查询
select <字段列表> from <表> where <字段> between <取值> and <取值>;带取值范围查询
select <字段列表> from <表> where <字段> like '%<字符串>%';包含内容查询,常用于模糊搜索功能
增加

Create

insert into <表> (<字段列表>) values (<赋值列表>);指定字段插入一条新记录
insert into <表> (<字段列表>) values (<赋值列表1>),(<赋值列表2>),...,(<赋值列表n>);同时插入多条记录

修改

Update

update <表> set <字段1>=<赋值1>,<字段2>=<赋值2>,...,<字段n>=<赋值n> where <主键条件>修改指定主键的记录
删除

Delete

delete from <表> where <主键条件>

删除指定主键的记录

程序实现数据读取操作

对于部分数据的读取,一般直接使用DataReader对象,DataReader对象通过Command对象的ExecuteReader()方法读取数据表。

string sql = "select * from mainstudent where num=" + current;
string conStr = "server=localhost;user id=root;password=123456;database=studentmanage";
MySqlConnection con = new MySqlConnection(conStr);
con.Open();
MySqlCommand cmd = new MySqlCommand(sql, con);//设置Command对象的命令和连接器参数
MySqlDataReader reader = cmd.ExecuteReader();//DataReader对象通过Command对象的ExecuteReader()方法读取数据表
if(reader.Read())
{
    textBox1.Text = reader.GetString(0).ToString();
    textBox2.Text = reader.GetString(1);
}
reader.Close();
con.Close();

若使用DataAdapter对象进行读取,则需要先设置DataSet对线,通过DataAdpter对象的Fill()方法将数据源中的数据读取到DataSet中。

string conStr = ConfigurationManager.ConnectionStrings["conStr"].ConnectionString;
MySqlConnection con=null;
MySqlDataAdapter adapter = null;
DataSet ds = null;
private void button1_Click(object sender, EventArgs e)
{
    con = new MySqlConnection(conStr);
    string sql = "select * from mainstudent";
    adapter = new MySqlDataAdapter(sql, con);
    ds= new DataSet();
    adapter.Fill(ds, "mainstudent");
    dataGridView1.DataSource = ds.Tables["mainstudent"];
}

在大型项目中,除了使用DataReader对象部分读取外,还可以将读取结果存在数据表(DataTable)中进行完整读取。

//GetReader()方法实现对数据库中的数据进行读取,返回DataReader对象
public static MySqlDataReader GetReader(string sql)//无参读取
{
    MySqlCommand cmd= new MySqlCommand(sql,Connection);
    return cmd.ExecuteReader();
}
public static MySqlDataReader GetReader(string sql,params MySqlParameter[] values)//有参读取
{
    MySqlCommand cmd = new MySqlCommand(sql, Connection);
    cmd.Parameters.AddRange(values);
    return cmd.ExecuteReader();
}
//GetDataTable()方法实现整个数据表的读取,返回DataTable对象
public static DataTable GetDataTable(string sql)
{
    MySqlDataAdapter da=new MySqlDataAdapter(sql,Connection);
    DataSet ds= new DataSet();
    da.Fill(ds);
    return ds.Tables[0];
}
public static DataTable GetDataTable(string sql, params MySqlParameter[] values)
{
    MySqlCommand cmd=new MySqlCommand( sql,Connection);
    cmd.Parameters.AddRange(values);
    MySqlDataAdapter da = new MySqlDataAdapter(cmd);
    DataSet ds=new DataSet();
    da.Fill(ds);
    return ds.Tables[0];
}

调用到这些方法时,只需要进行传参即可。

程序实现增删改操作

对数据库中的数据表进行增删改,可以使用Command对象或DataAdapter对象实现。使用Command对象对数据表进行增删改,首先需要将相关SQL语句与连接器对象参数传入Command对象的构造方法中,对于字段参数的赋值可以通过Parameters.AddWithValue()方法来实现,Command对象使用ExecuteNonQuery()方法实现对数据的修改。例如加入记录。

private void button4_Click(object sender, EventArgs e)
{
    string sql = "insert into mainstudent(num,name,sex) values(@num,@name,@sex)";
    string conStr = "server=localhost;user id=root;password=123456;database=studentmanage";
    MySqlConnection con = new MySqlConnection(conStr);
    MySqlCommand cmd=new MySqlCommand(sql, con);
    cmd.Parameters.AddWithValue("@num", 1);
    cmd.Parameters.AddWithValue("@name", "LiHua");
    cmd.Parameters.AddWithValue("@sex", "Man");
    con.Open();
    cmd.ExecuteNonQuery();//修改时使用的方法,不会造成内存泄漏
    con.Close();
    MessageBox.Show("数据增添成功");
}

对于修改和删除,操作方法是一样的,只需要更改相应的SQL语句以及参数设定,这里就不在演示代码。一般在大型项目中,定义一个专门类去实现对数据库的增删查改,通常写一个方法实现SQL语句的执行,进行增删改的操作,在其它类中分别定义增、改、删的方法,将参数引入,调用该类的方法。

//ExecuteCommand()方法,实现SQL语句的执行,进行增删改操作,返回受影响的行数
public static int ExecuteCommand(string  sql)//无参修改
{
    MySqlCommand cmd=new MySqlCommand(sql, Connection);
    return cmd.ExecuteNonQuery();//返回受影响的行数
}
public static int ExecuteCommand(string sql,params MySqlParameter[] values)//有参修改
{
    MySqlCommand cmd=new MySqlCommand(sql,Connection);
    cmd.Parameters.AddRange(values);
    return cmd.ExecuteNonQuery();
}

对于参数的传入,这里给出一个例子,调用上述方法实现数据的修改。

//修改书目
public static bool UpdateBook(Book book)
{
    string sql = @"update book set bookName=@bookName,writerName=@writerName,publishClub=@publishClub,version=@version,inventory=@inventory where ISBN=@ISBN";
    MySqlParameter p1 = new MySqlParameter("@bookName", book.BookName);
    MySqlParameter p2 = new MySqlParameter("@writerName", book.WriterName);
    MySqlParameter p3 = new MySqlParameter("@publishClub", book.PublishClub);
    MySqlParameter p4 = new MySqlParameter("@version", book.Version);
    MySqlParameter p5 = new MySqlParameter("@inventory", book.Inventory);
    MySqlParameter p6 = new MySqlParameter ("@ISBN", book.ISBN);
if (DBOper.ExecuteCommand(sql, p1, p2, p3, p4, p5, p6) == 1)
{
    return true;
}
    else { return false; }
}

当然,将所有的参数组成数组,再传入方法参数中也是可以的。

对于使用DataAdapter对象实现,先需要声明Command、DataAdapter和DataSet对象,建立CommandBuilder对象与DataAdapter对象之间的关联,在增加/删除记录时,可以使用DataSet的行或行集合对象去新增/删除行,最后再由DataAdapter对线执行Update()方法将数据集中的数据更新到数据源中。例如使用DataAdapter对数据进行记录增加。

string conStr = ConfigurationManager.ConnectionStrings["conStr"].ConnectionString;
MySqlConnection con=null;
MySqlDataAdapter adapter = null;
DataSet ds = null;   
     
private void button4_Click(object sender, EventArgs e)
{
    MySqlCommandBuilder builder = new MySqlCommandBuilder(adapter);
    DataRow r1 = ds.Tables["mainstudent"].NewRow();
    r1[0] = textBox1.Text;
    r1[1] = textBox2.Text;
    ds.Tables[0].Rows.Add(r1);
    adapter.Update(ds, "mainstudent");
    dataGridView1.DataSource = ds.Tables["mainstudent"];
}

这里需要注意的是,当DataAdapter对象操作单个数据表时,可以利用CommandBuilder对象自动为DataAdapter提供的Insert、Update、Delete方法。

最后,在信息管理类型的项目中,对数据库的使用是必不可少的,开发人员需要熟练掌握数据库的连接方法,悉知常用的CRUD SQL语句,利用管理对象实现对数据的增删查改操作,对于Command与DataAdapter对象的选择,本文暂不概述。