65.9K
CodeProject 正在变化。 阅读更多。
Home

MySqlExpress - 简化 C#/.NET 中 MySQL 的使用

starIconstarIconstarIconstarIconstarIcon

5.00/5 (5投票s)

2022 年 12 月 7 日

CPOL

5分钟阅读

viewsIcon

12136

downloadIcon

279

使用 C# 中的 MySQL 加速开发

引言

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

  1. 启动事务、提交、回滚
  2. 从 MySQL 表中获取对象行
  3. 获取自定义对象结构
  4. 获取单个值 (ExecuteScalar<T>)
  5. 保存 (v1.7) - 保存对象
  6. 插入行 (保存数据)
  7. 更新行 (更新数据)
  8. 插入更新
  9. 生成 Like 字符串
  10. 执行 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 个查询(主要指 INSERTUPDATEDELETE),它们将逐一执行,这会花费大量时间。

通过使用 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
© . All rights reserved.