目錄
??前言
??MySQL數(shù)據(jù)庫(kù)簡(jiǎn)介
??數(shù)據(jù)庫(kù)的基本概念
??ADO.NET體系結(jié)構(gòu)
- 數(shù)據(jù)提供程序(.NET Framework Data Provider)
- 程序數(shù)據(jù)集(DataSet)
??數(shù)據(jù)庫(kù)的訪問(wèn)形式
??數(shù)據(jù)庫(kù)的連接
??實(shí)現(xiàn)增查改刪(CRUD)操作
- CRUD SQL常用語(yǔ)句
- 程序?qū)崿F(xiàn)數(shù)據(jù)讀取操作
- 程序?qū)崿F(xiàn)增刪改操作
??前言
數(shù)據(jù)庫(kù)的使用在涉及或以信息管理為主的軟件設(shè)計(jì)中是不可或缺的一部分。開(kāi)發(fā)人員需要了解數(shù)據(jù)庫(kù)基本概念,熟系對(duì)數(shù)據(jù)庫(kù)的使用,包括基本的可視化軟件管理,SQL語(yǔ)句命令操作。為實(shí)現(xiàn)窗體軟件(WinForm/WPF)對(duì)數(shù)據(jù)庫(kù)進(jìn)行讀取和寫入操作,需要先了解數(shù)據(jù)庫(kù)的訪問(wèn)形式,了解ADO.NET結(jié)構(gòu),掌握使用程序?qū)?shù)據(jù)庫(kù)進(jìn)行連接實(shí)現(xiàn),能夠?qū)?shù)據(jù)庫(kù)進(jìn)行增刪查改操作。本文從數(shù)據(jù)庫(kù)的基本使用,到使用程序?qū)崿F(xiàn)增刪查改操作,借助.NET API文檔理解相關(guān)數(shù)據(jù)庫(kù)操作類,完整介紹WinForm/WPF實(shí)現(xiàn)數(shù)據(jù)庫(kù)連接與操作的方法。[注:本文多以個(gè)人理解與應(yīng)用測(cè)試角度編寫,如有表達(dá)不妥或結(jié)構(gòu)錯(cuò)誤的部分,歡迎批評(píng)指正。]
??MySQL數(shù)據(jù)庫(kù)簡(jiǎn)介
MySQL是一個(gè)關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng),由瑞典MySQL AB 公司開(kāi)發(fā),屬于 Oracle 旗下產(chǎn)品。MySQL 是最流行的關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng)之一。2006年,Oracle收購(gòu)InnoDB引擎,這深刻影響了后來(lái)MySQL的發(fā)展——因?yàn)镸ySQL被賣身兩次后歸于Oracle麾下。2008年,瑞典MySQLAB公司被Sun收購(gòu)。次年,Sun被Oracle收購(gòu),MySQL數(shù)據(jù)庫(kù)被一并納入Oracle,進(jìn)入OracleMySQL時(shí)代。2010年發(fā)布的MySQL5.5版本中,將其默認(rèn)的存儲(chǔ)引擎由MyISAM更換為InnoDB。
??數(shù)據(jù)庫(kù)的基本概念
比較普遍的定義是,數(shù)據(jù)庫(kù)(Database,DB)是一個(gè)長(zhǎng)期儲(chǔ)存在計(jì)算機(jī)內(nèi)的、有組織、有共享、統(tǒng)一管理的數(shù)據(jù)集合。數(shù)據(jù)庫(kù)的基本組成包括字段、記錄、數(shù)據(jù)表、數(shù)據(jù)庫(kù)和主鍵。
字段 | Field | 二維表中的列,描述關(guān)系的屬性特征 |
---|---|---|
記錄 | Record | 二維表中的行 |
數(shù)據(jù)表 | Table | 沒(méi)有重復(fù)的行列構(gòu)成的關(guān)系表 |
數(shù)據(jù)庫(kù) | Database | 多個(gè)相關(guān)聯(lián)數(shù)據(jù)表的集合 |
主鍵 | Key | 能夠唯一標(biāo)識(shí)不同記錄的單個(gè)或多個(gè)字段的組合 |
??ADO.NET體系結(jié)構(gòu)
.NET編程環(huán)境中優(yōu)先使用數(shù)據(jù)訪問(wèn)接口ADO.NET提供了平臺(tái)互用性和可伸縮的數(shù)據(jù)訪問(wèn)。ADO.NET 提供對(duì)諸如 SQL Server 和 XML 這樣的數(shù)據(jù)源以及通過(guò) OLE DB 和 ODBC 公開(kāi)的數(shù)據(jù)源的一致訪問(wèn)。 共享數(shù)據(jù)的使用方應(yīng)用程序可以使用 ADO.NET 連接到這些數(shù)據(jù)源,并可以檢索、處理和更新其中包含的數(shù)據(jù)。
![[C#] WinForm/WPF 實(shí)現(xiàn)數(shù)據(jù)庫(kù)連接與操作(MySQL)](https://imgs.yssmx.com/Uploads/2023/06/488736-1.png)
數(shù)據(jù)提供程序(.NET Framework Data Provider)
Connection:數(shù)據(jù)連接類,建立與數(shù)據(jù)源的連接
Command:數(shù)據(jù)命令類,使用SQL語(yǔ)句對(duì)數(shù)據(jù)源執(zhí)行操作命令,用于修改數(shù)據(jù)、查詢數(shù)據(jù)、運(yùn)行存儲(chǔ)過(guò)程,其中,Parameter為參數(shù),參數(shù)前面有一個(gè)“@”符號(hào),表示它將被視為參數(shù)
DataReader:數(shù)據(jù)讀取類,用于從數(shù)據(jù)源讀取數(shù)據(jù)流
DataAdapter:數(shù)據(jù)流轉(zhuǎn)類,F(xiàn)ill()方法將數(shù)據(jù)源數(shù)據(jù)填充至“內(nèi)存”數(shù)據(jù)集DataSet,Update()方法將數(shù)據(jù)集中的數(shù)據(jù)更新至數(shù)據(jù)源中
程序數(shù)據(jù)集(DataSet)
實(shí)現(xiàn)獨(dú)立于任何數(shù)據(jù)源的斷開(kāi)式數(shù)據(jù)訪問(wèn),其包含任意多個(gè)數(shù)據(jù)表(DataTable)
??數(shù)據(jù)庫(kù)的訪問(wèn)形式
非斷開(kāi)式:持續(xù)保持連接,直到執(zhí)行關(guān)閉命令,占用連接資源,數(shù)據(jù)更新及時(shí)
斷開(kāi)式:數(shù)據(jù)完成讀取/更新后立即斷開(kāi),執(zhí)行效率高,占用時(shí)間短,數(shù)據(jù)更新不及時(shí)
??數(shù)據(jù)庫(kù)的連接
使用Connection對(duì)象實(shí)現(xiàn)數(shù)據(jù)庫(kù)的連接,其提供Open()方法進(jìn)行數(shù)據(jù)庫(kù)的連接,Close()方法斷開(kāi)連接。編寫連接語(yǔ)句,將其作為參數(shù)傳入Connection類的構(gòu)造方法中。對(duì)于使用MySQL數(shù)據(jù)庫(kù)時(shí),可以先使用NuGet包管理器對(duì)項(xiàng)目安裝MySql.Data的資源包,并引用相關(guān)命名空間。
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("數(shù)據(jù)庫(kù)連接成功!");
con.Close();
}
在具體使用時(shí),要根據(jù)自己在安裝MySQL時(shí)的相關(guān)配置,輸入對(duì)應(yīng)的賬號(hào)密碼。為了保證封裝特性以及設(shè)計(jì)模式中的開(kāi)閉原則,我們通常將數(shù)據(jù)庫(kù)的連接語(yǔ)句寫在配置文件中,后期對(duì)軟件的使用修改時(shí)只需操作配置文件即可,無(wú)需修改原有代碼。對(duì)于配置文件,我們需要向其中加入鍵值對(duì)。
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<connectionStrings>
<add name="conStr" connectionString="server=localhost;user id=root;password=123456;database=studentmanage;Charset=utf8;"/>
</connectionStrings>
調(diào)用相關(guān)命名空間后,在方法中我們讀取配置文件中的鍵值。
using System.Configuration;
MySqlConnection conn=null;
string connStr = ConfigurationManager.ConnectionStrings["ConStr"].ConnectionString;
conn = new MySqlConnection(connStr);
conn.Open();
在大型項(xiàng)目中,我們一般定義一個(gè)類,專門用于實(shí)現(xiàn)對(duì)數(shù)據(jù)庫(kù)的連接和操作,在該類中設(shè)置一個(gè)Connection屬性,每當(dāng)調(diào)用到該屬性時(shí),就自動(dòng)實(shí)現(xiàn)對(duì)數(shù)據(jù)庫(kù)的連接。
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屬性,調(diào)用時(shí)建立對(duì)數(shù)據(jù)庫(kù)的連接
public static MySqlConnection Connection
{
get
{
//無(wú)Connection對(duì)象時(shí)
if (conn == null)
{
string connStr = ConfigurationManager.ConnectionStrings["ConStr"].ConnectionString;
conn = new MySqlConnection(connStr);
conn.Open();
}
//Connection對(duì)象關(guān)閉連接時(shí)
else if (conn.State==System.Data.ConnectionState.Closed)
{conn.Close(); }
//Connection對(duì)象斷開(kāi)連接時(shí)
else if (conn.State == System.Data.ConnectionState.Broken)
{conn.Close(); conn.Open(); }
return conn;
}
}
}
}
??實(shí)現(xiàn)增查改刪(CRUD)操作
對(duì)于數(shù)據(jù)庫(kù)的操作,一般掌握順序是查增改刪,下面均以這個(gè)順序介紹CRUD SQL常用語(yǔ)句與程序?qū)崿F(xiàn)CRUD的操作步驟。
CRUD SQL常用語(yǔ)句
讀取 Read |
select <字段列表> from <表或視圖> where <查詢條件>; | 基本查詢語(yǔ)句 |
---|---|---|
select * form <表>; | 查詢整表(“*”通配符查詢所有字段) | |
select <字段列表> from <表>; | 查詢指定字段 | |
select <字段列表> from <表> where <字段> in (<取值列表>); | 多取值條件查詢 | |
select <字段列表> from <表> where <字段> between <取值> and <取值>; | 帶取值范圍查詢 | |
select <字段列表> from <表> where <字段> like '%<字符串>%'; | 包含內(nèi)容查詢,常用于模糊搜索功能 | |
增加 Create |
insert into <表> (<字段列表>) values (<賦值列表>); | 指定字段插入一條新記錄 |
insert into <表> (<字段列表>) values (<賦值列表1>),(<賦值列表2>),...,(<賦值列表n>); | 同時(shí)插入多條記錄 | |
修改 Update |
update <表> set <字段1>=<賦值1>,<字段2>=<賦值2>,...,<字段n>=<賦值n> where <主鍵條件> | 修改指定主鍵的記錄 |
刪除 Delete |
delete from <表> where <主鍵條件> | 刪除指定主鍵的記錄 |
程序?qū)崿F(xiàn)數(shù)據(jù)讀取操作
對(duì)于部分?jǐn)?shù)據(jù)的讀取,一般直接使用DataReader對(duì)象,DataReader對(duì)象通過(guò)Command對(duì)象的ExecuteReader()方法讀取數(shù)據(jù)表。
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);//設(shè)置Command對(duì)象的命令和連接器參數(shù)
MySqlDataReader reader = cmd.ExecuteReader();//DataReader對(duì)象通過(guò)Command對(duì)象的ExecuteReader()方法讀取數(shù)據(jù)表
if(reader.Read())
{
textBox1.Text = reader.GetString(0).ToString();
textBox2.Text = reader.GetString(1);
}
reader.Close();
con.Close();
若使用DataAdapter對(duì)象進(jìn)行讀取,則需要先設(shè)置DataSet對(duì)線,通過(guò)DataAdpter對(duì)象的Fill()方法將數(shù)據(jù)源中的數(shù)據(jù)讀取到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"];
}
在大型項(xiàng)目中,除了使用DataReader對(duì)象部分讀取外,還可以將讀取結(jié)果存在數(shù)據(jù)表(DataTable)中進(jìn)行完整讀取。
//GetReader()方法實(shí)現(xiàn)對(duì)數(shù)據(jù)庫(kù)中的數(shù)據(jù)進(jìn)行讀取,返回DataReader對(duì)象
public static MySqlDataReader GetReader(string sql)//無(wú)參讀取
{
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()方法實(shí)現(xiàn)整個(gè)數(shù)據(jù)表的讀取,返回DataTable對(duì)象
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];
}
調(diào)用到這些方法時(shí),只需要進(jìn)行傳參即可。
程序?qū)崿F(xiàn)增刪改操作
對(duì)數(shù)據(jù)庫(kù)中的數(shù)據(jù)表進(jìn)行增刪改,可以使用Command對(duì)象或DataAdapter對(duì)象實(shí)現(xiàn)。使用Command對(duì)象對(duì)數(shù)據(jù)表進(jìn)行增刪改,首先需要將相關(guān)SQL語(yǔ)句與連接器對(duì)象參數(shù)傳入Command對(duì)象的構(gòu)造方法中,對(duì)于字段參數(shù)的賦值可以通過(guò)Parameters.AddWithValue()方法來(lái)實(shí)現(xiàn),Command對(duì)象使用ExecuteNonQuery()方法實(shí)現(xiàn)對(duì)數(shù)據(jù)的修改。例如加入記錄。
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();//修改時(shí)使用的方法,不會(huì)造成內(nèi)存泄漏
con.Close();
MessageBox.Show("數(shù)據(jù)增添成功");
}
對(duì)于修改和刪除,操作方法是一樣的,只需要更改相應(yīng)的SQL語(yǔ)句以及參數(shù)設(shè)定,這里就不在演示代碼。一般在大型項(xiàng)目中,定義一個(gè)專門類去實(shí)現(xiàn)對(duì)數(shù)據(jù)庫(kù)的增刪查改,通常寫一個(gè)方法實(shí)現(xiàn)SQL語(yǔ)句的執(zhí)行,進(jìn)行增刪改的操作,在其它類中分別定義增、改、刪的方法,將參數(shù)引入,調(diào)用該類的方法。
//ExecuteCommand()方法,實(shí)現(xiàn)SQL語(yǔ)句的執(zhí)行,進(jìn)行增刪改操作,返回受影響的行數(shù)
public static int ExecuteCommand(string sql)//無(wú)參修改
{
MySqlCommand cmd=new MySqlCommand(sql, Connection);
return cmd.ExecuteNonQuery();//返回受影響的行數(shù)
}
public static int ExecuteCommand(string sql,params MySqlParameter[] values)//有參修改
{
MySqlCommand cmd=new MySqlCommand(sql,Connection);
cmd.Parameters.AddRange(values);
return cmd.ExecuteNonQuery();
}
對(duì)于參數(shù)的傳入,這里給出一個(gè)例子,調(diào)用上述方法實(shí)現(xiàn)數(shù)據(jù)的修改。
//修改書(shū)目
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; }
}
當(dāng)然,將所有的參數(shù)組成數(shù)組,再傳入方法參數(shù)中也是可以的。
對(duì)于使用DataAdapter對(duì)象實(shí)現(xiàn),先需要聲明Command、DataAdapter和DataSet對(duì)象,建立CommandBuilder對(duì)象與DataAdapter對(duì)象之間的關(guān)聯(lián),在增加/刪除記錄時(shí),可以使用DataSet的行或行集合對(duì)象去新增/刪除行,最后再由DataAdapter對(duì)線執(zhí)行Update()方法將數(shù)據(jù)集中的數(shù)據(jù)更新到數(shù)據(jù)源中。例如使用DataAdapter對(duì)數(shù)據(jù)進(jìn)行記錄增加。
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"];
}
這里需要注意的是,當(dāng)DataAdapter對(duì)象操作單個(gè)數(shù)據(jù)表時(shí),可以利用CommandBuilder對(duì)象自動(dòng)為DataAdapter提供的Insert、Update、Delete方法。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-488736.html
最后,在信息管理類型的項(xiàng)目中,對(duì)數(shù)據(jù)庫(kù)的使用是必不可少的,開(kāi)發(fā)人員需要熟練掌握數(shù)據(jù)庫(kù)的連接方法,悉知常用的CRUD SQL語(yǔ)句,利用管理對(duì)象實(shí)現(xiàn)對(duì)數(shù)據(jù)的增刪查改操作,對(duì)于Command與DataAdapter對(duì)象的選擇,本文暫不概述。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-488736.html
到了這里,關(guān)于[C#] WinForm/WPF 實(shí)現(xiàn)數(shù)據(jù)庫(kù)連接與操作(MySQL)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!