MySqlExpress - 简化 C#/.NET 中 MySQL 的使用
使用 C# 中的 MySQL 加速开发
- 下载辅助工具和源代码 - MySqlExpress.v1.7.2.zip
- Github
- Nuget MySqlConnector (MIT) 的 Nuget 包
- MySql.Data (Oracle) 的 Nuget 包
引言
MySqlExpress
由两部分组成。
第一部分是 MySqlExpress
的 C# 类库。它提供了一些“快捷方式”,以简化与 MySQL 相关的任务的执行。
首先,下载源代码并将“MySqlExpress.cs”类文件添加到您的项目中,或者将 MySqlExpress
项目的引用添加到您的项目中,或者将 MySqlExpress
的 Nuget 包安装到您的项目中。
第二部分是一个名为“MySqlExpress Helper.exe”的软件。该软件的主要功能是生成 C# 类对象,这将在下面详细介绍。这个小程序可以在本文中下载,也可以在 Github Release 部分下载。在本文的其余部分,我将把这个小程序称为“辅助应用程序”。
MySqlExpress
基于 MySqlConnector
(MIT) 库构建。如果您希望使用其他连接器或提供程序,您可以下载源代码并使用您喜欢的连接器进行编译。
开始之前
像往常一样,要开始使用 MySQL 进行编码,首先添加以下 using
语句以允许使用 MySqlconnector
(MIT) 库。
using MySqlConnector;
在本文中,我们假设将 MySQL 连接 string
存储为 static
字段。例如
public class config
{
public static string ConnString =
"server=localhost;user=root;pwd=1234;database=test;";
}
因此,我们可以在项目中的任何地方获得连接 string
,如下所示
config.ConnString
这是标准的 MySQL 连接代码块
using (MySqlConnection conn = new MySqlConnection(config.ConnString))
{
using (MySqlCommand cmd = new MySqlCommand())
{
cmd.Connection = conn;
conn.Open();
// execute queries
conn.Close();
}
}
声明一个新的 MySqlExpress
对象以开始使用
using (MySqlConnection conn = new MySqlConnection(config.ConnString))
{
using (MySqlCommand cmd = new MySqlCommand())
{
cmd.Connection = conn;
conn.Open();
MySqlExpress m = new MySqlExpress(cmd);
// perform queries
conn.Close();
}
}
上面所示的标准 MySQL 连接代码块可以保存在 Visual Studio 工具箱栏中。这样,下次您需要此代码块时,就可以从工具箱栏中拖放。
现在代码块已保存在 toolbox
中。
下次,无论何时需要代码块,只需将其从 toolbox
拖到文本编辑器中。
开始 - 使用 MySqlExpress
- 启动事务、提交、回滚
- 从 MySQL 表中获取对象行
- 获取自定义对象结构
- 获取单个值 (
ExecuteScalar<T>
) - 保存 (v1.7) - 保存对象
- 插入行 (保存数据)
- 更新行 (更新数据)
- 插入更新
- 生成 Like 字符串
- 执行 SQL 语句
1. 启动事务、提交和回滚
using (MySqlConnection conn = new MySqlConnection(config.ConnString))
{
using (MySqlCommand cmd = new MySqlCommand())
{
cmd.Connection = conn;
conn.Open();
MySqlExpress m = new MySqlExpress(cmd);
try
{
m.StartTransaction();
// perform lots of queries
// action success
m.Commit();
}
catch
{
// Error occur
m.Rollback();
}
conn.Close();
}
}
使用 MySQL TRANSACTION
有几个好处。
如果您执行 1000 个查询(主要指 INSERT
、UPDATE
和 DELETE
),它们将逐一执行,这会花费大量时间。
通过使用 TRANSACTION + COMMIT
,所有 1000 个查询将一次性执行。这节省了大量的磁盘操作时间。
有时,存在涉及多个表和行的操作链。没有事务,如果在过程中发生任何问题或错误,整个操作将在中途终止,导致数据部分或不完整保存 - 这将难以修复数据。因此,TRANSACTION
可以防止这种情况发生。使用 transaction
,整个操作链将被取消。
ROLLBACK
意味着取消。丢弃在 TRANSACTION
期间发送的所有查询。
阅读有关 transaction
的更多信息,请访问 此链接。
2. 从 MySQL 表中获取对象行
假设我们有如下 MySQL 表
CREATE TABLE `player` (
`id` int unsigned NOT NULL AUTO_INCREMENT,
`code` varchar(10),
`name` varchar(300),
`date_register` datetime,
`tel` varchar(100),
`email` varchar(100),
`status` int unsigned,
PRIMARY KEY (`id`));
创建一个新类
public class obPlayer
{
}
有 3 种创建类对象的方式。
第一种方式:私有字段 + 公有属性
运行 Helper 应用程序。
将其粘贴到新创建的类中
public class obPlayer
{
int id = 0;
string code = "";
string name = "";
DateTime date_register = DateTime.MinValue;
string tel = "";
string email = "";
int status = 0;
public int Id { get { return id; } set { id = value; } }
public string Code { get { return code; } set { code = value; } }
public string Name { get { return name; } set { name = value; } }
public DateTime DateRegister { get { return date_register; } set { date_register = value; } }
public string Tel { get { return tel; } set { tel = value; } }
public string Email { get { return email; } set { email = value; } }
public int Status { get { return status; } set { status = value; } }
}
使用这种组合(私有字段 + 公有属性)的目的
私有字段用于匹配 MySQL 表的列名并映射数据。
公有属性用于将字段的命名转换为 C# 编码命名约定,即 PascalCase
阅读有关 [C# 编码命名约定] 的更多信息
MySQL 列的命名约定使用小写字母和下划线来分隔单词。
阅读有关 [MySQL 命名约定] 的更多信息
下划线“_”符号比仅使用拉丁字符输入起来不那么方便。
因此,将字段名转换为 PascalCase 将符合 C# 命名约定,并提高输入速度。
第二种方式:公有属性
将文本粘贴到类中
public class obPlayer
{
public int id { get; set; }
public string code { get; set; }
public string name { get; set; }
public DateTime date_register { get; set; }
public string tel { get; set; }
public string email { get; set; }
public int status { get; set; }
}
第三种方式:公有字段
将其粘贴到类中
public class obPlayer
{
public int id = 0;
public string code = "";
public string name = "";
public DateTime date_register = DateTime.MinValue;
public string tel = "";
public string email = "";
public int status = 0;
}
接下来,获取单个“Player
”对象的代码。
// declare the object
obPlayer p = null;
// parameterize the values
var dicParam = new Dictionary<string, object>();
dicParam["@vid"] = 1;
p = m.GetObject<obPlayer>($"select * from player where id=@vid;", dicParam);
获取对象列表(从 MySQL 表获取多个行)
List<obPlayer> lst = null;
// parameterize the values
var dicParam = new Dictionary<string, object>();
dicParam["@vname"] = "%adam%";
lst = m.GetObjectList<obPlayer>($"select * from player where name like @vname;",
dicParam);
3. 获取自定义对象结构
一个典型的例子是多个 SQL JOIN
语句。例如
select a.*, b.`year`, c.name 'teamname', c.code 'teamcode', c.id 'teamid'
from player a
inner join player_team b on a.id=b.player_id
inner join team c on b.team_id=c.id;
输出表结构是自定义的。
要创建非标准化的表对象结构,请打开 Helper 程序。输入自定义的 SQL JOIN
语句。
创建类对象
public class obPlayerTeam
{
}
将文本粘贴到类中
public class obPlayerTeam
{
int id = 0;
string code = "";
string name = "";
DateTime date_register = DateTime.MinValue;
string tel = "";
string email = "";
int status = 0;
int year = 0;
string teamname = "";
string teamcode = "";
int teamid = 0;
public int Id { get { return id; } set { id = value; } }
public string Code { get { return code; } set { code = value; } }
public string Name { get { return name; } set { name = value; } }
public DateTime DateRegister { get { return date_register; } set { date_register = value; } }
public string Tel { get { return tel; } set { tel = value; } }
public string Email { get { return email; } set { email = value; } }
public int Status { get { return status; } set { status = value; } }
public int Year { get { return year; } set { year = value; } }
public string Teamname { get { return teamname; } set { teamname = value; } }
public string Teamcode { get { return teamcode; } set { teamcode = value; } }
public int Teamid { get { return teamid; } set { teamid = value; } }
}
获取自定义表对象
// declare the object
List<obPlayerTeam> lst = null;
// parameterized the value
var dicParam = new Dictionary<string, object>();
dicParam["@vname"] = "%adam%";
lst = m.GetObjectList<obPlayerTeam>(@"select a.*, b.`year`,
c.name 'teamname', c.code 'teamcode', c.id 'teamid'
from player a inner join player_team b on a.id=b.player_id
inner join team c on b.team_id=c.id
where a.name like @vname;", dicParam);
4. 获取单个值 (ExecuteScalar<T>)
MySqlExpress m = new MySqlExpress(cmd);
// int
int count = m.ExecuteScalar<int>("select count(*) from player;");
// datetime
DateTime d = m.ExecuteScalar<DateTime>("select date_register from player where id=2;");
// string
string name = m.ExecuteScalar<string>("select name from player where id=1;");
获取带参数的单个值
MySqlExpress m = new MySqlExpress(cmd);
// parameters
var dicParam1 = new Dictionary<string, object>();
dicParam1["@vname"] = "%adam%";
var dicParam2 = new Dictionary<string, object>();
dicParam2["@vid"] = 1;
// int
int count = m.ExecuteScalar<int>("select count(*) from player where name like @vname;",
dicParam1);
// datetime
DateTime d = m.ExecuteScalar<DateTime>("select date_register from player where id=@vid;",
dicParam2);
// string
string name = m.ExecuteScalar<string>("select name from player where id=@vid;",
dicParam2);
5. 保存 (v1.7) - 保存对象
“INSERT
”和“UPDATE
”的组合。此方法将首先尝试执行 INSERT
。如果数据的主键已存在于 MySQL 表中,则会执行 UPDATE
。
// Syntax
m.Save(tablename, class);
m.SaveList(tablename, List<class>);
// Example:
// Saving single object
m.Save("player", player);
// Saving list of objects
m.SaveList("player", lstPlayer);
6. 插入行 (保存数据)
使用字典执行 INSERT
。
注意字典值将作为参数值插入
字段“id
”是主键,自动递增字段。因此,我们不需要为此字段插入数据。
从块中删除以下行
dic["id"] =
继续填写数据并执行 INSERT
获取 LAST INSERT ID
Dictionary<string, object> dic = new Dictionary<string, object>();
dic["code"] = "AA001";
dic["name"] = "John Smith";
dic["date_register"] = DateTime.Now;
dic["tel"] = "1298343223";
dic["email"] = "john_smith@mail.com";
dic["status"] = 1;
m.Insert("player", dic);
// Get the last insert id
int newid = m.LastInsertId;
7. 更新行 (更新数据)
使用字典执行 UPDATE
。
注意字典值将作为参数值插入
用于更新具有一个主键的表。参数
m.Update(tablename, dictionary, primary key column name, id);
删除第一个字典条目
dic["id"] =
将其粘贴到代码块中,填写值并执行 Update
命令
Dictionary<string, object> dic = new Dictionary<string, object>();
dic["code"] = "AA001";
dic["name"] = "John Smith";
dic["date_register"] = DateTime.Now;
dic["tel"] = "1298343223";
dic["email"] = "john_smith@mail.com";
dic["status"] = 1;
m.Update("player", dic, "id", 1);
用于更新具有多个主键或多个引用列的表。参数
m.Update(tablename, dictionary data, dictionary reference data);
示例
// data
Dictionary<string, object> dic = new Dictionary<string, object>();
dic["code"] = "AA001";
dic["name"] = "John Smith";
dic["date_register"] = DateTime.Now;
dic["tel"] = "1298343223";
dic["email"] = "john_smith@mail.com";
dic["status"] = 1;
// update condition / referrence column data
Dictionary<string, object> dicCond = new Dictionary<string, object>();
dicCond["year"] = 2022;
dicCond["team_id"] = 1;
m.Update("player_team", dic, dicCond);
8. 插入更新
注意字典值将作为参数值插入
这在表具有多个主键且没有自动递增字段时特别有用。
插入 > 如果主键不存在
更新 > 如果主键存在
首先,生成字典条目
接下来,生成更新列列表
将其粘贴到代码块中并运行 Insert Update
方法
List<string> lstUpdateCol = new List<string>();
lstUpdateCol.Add("team_id");
lstUpdateCol.Add("score");
lstUpdateCol.Add("level");
lstUpdateCol.Add("status");
// data
Dictionary<string, object> dic = new Dictionary<string, object>();
dic["year"] = 2022;
dic["player_id"] = 1;
dic["team_id"] = 1;
dic["score"] = 10m;
dic["level"] = 1;
dic["status"] = 1;
m.InsertUpdate("player_team", dic, lstUpdateCol);
9. 生成 Like 字符串
string name = "James O'Brien";
// parameters
Dictionary<string, object> dicParam = new Dictionary<string, object>();
dicParam["@vname"] = m.GetLikeString(name);
List<obPlayer> lst = null;
lst = m.GetObjectList<obPlayer>(
"select * from player where name like @vname;", dicParam);
10. 执行单个 SQL 语句
var dicParam = new Dictionary<string, object>();
dicParam["@vName"] = "James O'Brien";
dicParam["@vCode"] = "AA001";
m.Execute("delete from player where name=@vName or code=@vCode;",
dicParam);
祝您编码愉快!
历史
- 2022 年 12 月 8 日:初始版本
- ....
- 2023 年 1 月 8 日:添加了新功能。修复了一些错误。改进了演示项目。发布了 v1.7.2