简介:本文讲解了如何利用C#语言和***框架实现与MySQL数据库的增、删、查、改(CRUD)操作,并封装成易于使用的类库。文中详细介绍了数据库连接、SQL语句执行、事务处理、异常处理、连接池技术以及如何封装这些操作,最终提供了一个名为 DbHelperMySQL.cs
的类库。
1. C#与MySQL数据库交互
1.1 C#与MySQL的基本连接方式
C#与MySQL数据库交互是进行数据持久化操作的基石。要实现两者之间的通信,首先需要掌握如何建立连接。通常情况下,我们使用 MySql.Data.MySqlClient
命名空间下的 MySqlConnection
类来创建到MySQL数据库的连接。以下是创建数据库连接的基本步骤和代码示例。
// 引入命名空间
using MySql.Data.MySqlClient;
// 创建连接字符串
string connectionString = "server=localhost;user=root;database=testdb;port=3306;password=password;";
// 创建连接实例
using(MySqlConnection connection = new MySqlConnection(connectionString))
{
// 打开连接
connection.Open();
// 连接已经建立,可以进行数据库操作...
// 关闭连接
connection.Close();
}
在上述代码中,我们通过指定 connectionString
包含了连接MySQL数据库所需的所有信息。此外,使用 using
语句可以保证数据库连接在使用完毕后能够被正确地关闭,即使在执行数据库操作时发生异常,也能保证连接的正确关闭。
1.2 建立连接后的操作
成功建立连接后,C#程序便可以执行各种数据库操作。例如,可以使用 MySqlCommand
类来执行SQL命令,实现对MySQL数据库的增删改查(CRUD)操作。以下代码展示了如何执行一个简单的查询操作:
// 创建一个命令对象
using(MySqlCommand command = connection.CreateCommand())
{
// 设置命令文本
***mandText = "SELECT * FROM users";
// 执行命令并获取结果
using(MySqlDataReader reader = command.ExecuteReader())
{
while(reader.Read())
{
// 读取数据
Console.WriteLine(reader["username"].ToString());
}
}
}
在此示例中,我们首先通过 CreateCommand
方法创建一个 MySqlCommand
对象。然后,设置该命令的 CommandText
属性为SQL查询语句,并通过 ExecuteReader
方法执行命令,获取一个 MySqlDataReader
对象来读取查询结果。
这两段代码为C#与MySQL数据库交互提供了基础,贯穿后续章节的内容,我们将详细探讨如何利用这些基础进行更为复杂和高效的数据库操作。
2. CRUD操作实现
2.1 插入操作(Insert)
2.1.1 插入操作的基本步骤
在C#中与MySQL数据库进行插入操作,首先需要构建一个可执行的SQL插入语句,然后通过 MySqlConnection
对象打开连接,最后使用 MySqlCommand
对象执行该SQL语句,并关闭连接。在这一过程中,为了确保数据的安全性,应避免直接在SQL语句中嵌入变量,以防SQL注入攻击。下面是一个简单的示例:
using (var conn = new MySqlConnection(connectionString))
{
// 打开连接
conn.Open();
// 创建SQL命令
string sql = "INSERT INTO users (username, password) VALUES (@username, @password)";
using (var cmd = new MySqlCommand(sql, conn))
{
// 添加参数
cmd.Parameters.AddWithValue("@username", "testuser");
cmd.Parameters.AddWithValue("@password", "testpass");
// 执行SQL命令
cmd.ExecuteNonQuery();
}
}
2.1.2 使用参数化查询防止SQL注入
使用参数化查询是防止SQL注入的一种有效手段。与直接将变量拼接到SQL语句中不同,参数化查询通过使用参数占位符(例如 @parameterName
)来接收变量值,这些参数在执行时会被数据库引擎正确地处理和转义。
using (var conn = new MySqlConnection(connectionString))
{
conn.Open();
// 参数化SQL语句
string sql = "INSERT INTO users (username, password) VALUES (@username, @password)";
using (var cmd = new MySqlCommand(sql, conn))
{
// 添加带类型安全的参数
cmd.Parameters.Add("@username", MySqlDbType.VarChar).Value = "testuser";
cmd.Parameters.Add("@password", MySqlDbType.VarChar).Value = "testpass";
// 执行命令
cmd.ExecuteNonQuery();
}
}
在这个例子中, MySqlCommand.Parameters.Add
方法允许开发者指定参数的类型( MySqlDbType
),这为数据的正确处理提供了额外的保障。参数化查询不仅防止SQL注入,还能提高查询执行的效率,因为它允许数据库重用已经编译的查询计划。
2.2 查询操作(Select)
2.2.1 单表查询和多表联合查询
单表查询是指从单一的表中检索数据,而多表联合查询则是从两个或两个以上的表中检索数据。在MySQL中,联合查询通常通过 JOIN
子句来实现。下面的示例展示了如何进行单表查询和内连接的多表查询:
using (var conn = new MySqlConnection(connectionString))
{
conn.Open();
// 单表查询
string sqlSingle = "SELECT * FROM users WHERE username = @username";
using (var cmd = new MySqlCommand(sqlSingle, conn))
{
cmd.Parameters.AddWithValue("@username", "testuser");
using (var reader = cmd.ExecuteReader())
{
while (reader.Read())
{
Console.WriteLine(reader.GetString(0) + " " + reader.GetString(1));
}
}
}
// 多表联合查询
string sqlJoint = @"SELECT users.username, orders.order_id
FROM users
INNER JOIN orders ON users.id = orders.user_id
WHERE users.username = @username";
using (var cmd = new MySqlCommand(sqlJoint, conn))
{
cmd.Parameters.AddWithValue("@username", "testuser");
using (var reader = cmd.ExecuteReader())
{
while (reader.Read())
{
Console.WriteLine(reader.GetString(0) + " " + reader.GetInt32(1));
}
}
}
}
在此代码中, MySqlCommand
对象用于创建和执行SQL命令,通过 ExecuteReader
方法读取查询结果。 reader
对象中的 Read
方法用于逐行遍历结果集, GetString
和 GetInt32
等方法根据字段类型获取字段值。
2.2.2 分页查询与性能优化
分页查询通常是通过在SQL命令中使用 LIMIT
和 OFFSET
子句来实现的,其目的是限制结果集的大小,并允许用户访问数据的特定部分。例如,获取第二页的数据时,可以设置 LIMIT
为页面大小, OFFSET
为页面大小乘以页码。
int pageSize = 10;
int pageNumber = 2;
string sqlPaging = "SELECT * FROM users LIMIT @pageSize OFFSET (@pageNumber - 1) * @pageSize";
using (var conn = new MySqlConnection(connectionString))
{
conn.Open();
using (var cmd = new MySqlCommand(sqlPaging, conn))
{
cmd.Parameters.AddWithValue("@pageSize", pageSize);
cmd.Parameters.AddWithValue("@pageNumber", pageNumber);
using (var reader = cmd.ExecuteReader())
{
while (reader.Read())
{
Console.WriteLine(reader.GetString(0) + " " + reader.GetString(1));
}
}
}
}
在进行分页查询时,应当注意优化查询性能。在大数据集上使用分页时, OFFSET
可能会导致性能下降,因为它需要跳过前面的行。为了提高性能,可以考虑使用“键集分页”,即基于主键或其他唯一标识符进行分页,这样可以更有效地定位到需要的数据。
2.3 更新操作(Update)
2.3.1 更新操作的基本步骤
更新操作在数据库中是对已存在的数据行进行修改的过程。基本步骤与插入操作类似,首先创建一个SQL更新语句,然后通过 MySqlCommand
执行该语句。更新操作中,使用参数化查询也是推荐的做法,以避免SQL注入。
using (var conn = new MySqlConnection(connectionString))
{
conn.Open();
string sqlUpdate = "UPDATE users SET password = @newPassword WHERE id = @userId";
using (var cmd = new MySqlCommand(sqlUpdate, conn))
{
cmd.Parameters.AddWithValue("@newPassword", "newpass");
cmd.Parameters.AddWithValue("@userId", 1);
// 执行更新操作
int affectedRows = cmd.ExecuteNonQuery();
Console.WriteLine($"{affectedRows} record(s) affected.");
}
}
在上面的代码示例中, ExecuteNonQuery
方法用于执行非查询SQL语句(如 INSERT
, UPDATE
, DELETE
等)。该方法返回受影响的行数,这对于验证更新是否成功十分有用。
2.3.2 使用乐观锁解决并发问题
在高并发的系统中,简单的更新操作可能会导致数据不一致的问题。使用乐观锁是一种常见的解决并发更新冲突的方法。它基于数据版本号的原理:每次更新数据时,都会检查版本号是否与数据库中的版本号匹配。如果匹配,则更新数据并增加版本号;如果不匹配,则拒绝更新,提示冲突。
string sqlOptimisticLock = @"UPDATE users SET
password = @newPassword,
version = version + 1
WHERE id = @userId AND version = @version";
using (var conn = new MySqlConnection(connectionString))
{
conn.Open();
using (var cmd = new MySqlCommand(sqlOptimisticLock, conn))
{
cmd.Parameters.AddWithValue("@newPassword", "newpass");
cmd.Parameters.AddWithValue("@userId", 1);
cmd.Parameters.AddWithValue("@version", 1); // 假设初始版本号为1
// 执行更新操作
int affectedRows = cmd.ExecuteNonQuery();
if (affectedRows == 0)
{
Console.WriteLine("Update failed due to version mismatch.");
}
else
{
Console.WriteLine($"{affectedRows} record(s) affected.");
}
}
}
在乐观锁的实现中,版本号字段通常需要在数据库表中定义,并且需要在每次更新时检查和更新这个字段。
2.4 删除操作(Delete)
2.4.1 删除操作的基本步骤
删除操作通常用于移除不再需要的数据。与插入和更新操作类似,删除操作也需要构建SQL语句,并通过 MySqlCommand
执行。
using (var conn = new MySqlConnection(connectionString))
{
conn.Open();
string sqlDelete = "DELETE FROM users WHERE id = @userId";
using (var cmd = new MySqlCommand(sqlDelete, conn))
{
cmd.Parameters.AddWithValue("@userId", 1);
// 执行删除操作
int affectedRows = cmd.ExecuteNonQuery();
Console.WriteLine($"{affectedRows} record(s) deleted.");
}
}
ExecuteNonQuery
用于执行删除操作,返回的是受删除语句影响的行数。同样重要的是,对于删除操作,参数化查询也是必不可少的,以保证查询的安全性。
2.4.2 软删除与硬删除的区别及选择
软删除和硬删除是处理数据删除的两种不同策略。硬删除是指将数据从数据库中彻底删除,而软删除则是在数据库中保留记录,但通过添加一个状态字段(如 is_deleted
)来标记该记录已被删除。
软删除的优势: - 数据恢复容易,只需将状态字段改回未删除。 - 提供了审计或回滚删除操作的能力。 - 遵循数据保留策略,特别是在符合法律或行业标准要求的情况下。
硬删除的适用场景: - 数据隐私要求很高,不希望保留任何删除的记录。 - 数据库性能优化需要,软删除可能会增加额外的字段和索引。 - 法律法规允许且业务需求不强制保留删除数据。
在选择软删除还是硬删除时,需要根据具体的业务需求、法律要求和系统性能来决定。如果选择软删除,就需要修改表结构,添加状态字段,并在删除操作中更新此字段。
// 示例:软删除
string sqlSoftDelete = @"UPDATE users SET is_deleted = 1 WHERE id = @userId";
using (var conn = new MySqlConnection(connectionString))
{
conn.Open();
using (var cmd = new MySqlCommand(sqlSoftDelete, conn))
{
cmd.Parameters.AddWithValue("@userId", 1);
cmd.ExecuteNonQuery();
}
}
以上就是对CRUD操作在C#中与MySQL数据库交互的详细实现。通过这些基础操作,可以完成大部分与数据库相关的业务逻辑。
3. 框架使用
在处理数据库交互的过程中,框架的使用是至关重要的一个环节。本章将详细介绍一个名为 DbHelperMySQL
的类封装,这个类封装能够简化数据库操作的复杂性,提高代码的重用性,同时遵循设计模式的原则来组织代码。此外,本章也会讲解在使用数据库时如何管理连接,确保资源的高效利用与安全关闭。最后,将探讨如何执行 SQL 命令,包括单条 SQL 语句和存储过程或函数的执行。
3.1 DbHelperMySQL
类封装
3.1.1 类封装的优势与必要性
在编写数据库交互代码时,重复的数据库连接创建、异常处理、资源释放等操作往往会占据大量的代码量,导致代码重复和混乱。类封装的优势在于可以通过单一的入口点来访问数据库,隐藏了底层的实现细节,使代码更加清晰、易于管理和维护。
使用 DbHelperMySQL
这样的封装类可以带来以下好处:
- 代码复用性高 :将常用的数据库操作方法封装起来,可以在多处调用,减少重复代码。
- 维护简便 :当数据库连接字符串或基础操作逻辑发生变化时,只需要修改封装类即可,无需逐个修改业务代码。
- 提高安全性 :封装类可以集成为一个更安全的数据库访问接口,例如使用预编译语句来防止 SQL 注入。
- 代码可读性强 :通过良好的方法命名和注释,可以增强代码的可读性,使得其他开发者更容易理解和使用。
3.1.2 DbHelperMySQL
的设计原则和方法概述
DbHelperMySQL
设计遵循了单一职责原则,它将数据访问的职责独立出来,成为一个独立的类。以下是其主要设计原则:
- 封装性 :隐藏数据库操作的内部实现细节。
- 可扩展性 :支持插件或扩展方法,以支持未来可能的数据库操作需求。
- 健壮性 :提供异常处理机制,确保在出现异常时不会泄露资源。
主要方法概述:
-
OpenConnection()
:打开数据库连接。 -
CloseConnection()
:关闭数据库连接。 -
ExecuteNonQuery(string sql)
:执行非查询 SQL 命令。 -
ExecuteScalar(string sql)
:执行返回单个值(如聚合函数)的 SQL 命令。 -
ExecuteReader(string sql)
:执行返回数据集的 SQL 命令,并返回一个IDataReader
对象。 -
ExecuteProcedure(string procedureName, params object[] parameters)
:执行存储过程。
下面是 DbHelperMySQL
类的一个简化示例:
public class DbHelperMySQL
{
private string _connectionString;
public DbHelperMySQL(string connectionString)
{
_connectionString = connectionString;
}
public void OpenConnection()
{
// 实现连接逻辑,此处省略具体代码
}
public void CloseConnection()
{
// 实现关闭连接逻辑,此处省略具体代码
}
public void ExecuteNonQuery(string sql)
{
// 实现非查询 SQL 执行逻辑,此处省略具体代码
}
public object ExecuteScalar(string sql)
{
// 实现返回单个值的 SQL 执行逻辑,此处省略具体代码
return null;
}
public IDataReader ExecuteReader(string sql)
{
// 实现返回数据集的 SQL 执行逻辑,此处省略具体代码
return null;
}
public void ExecuteProcedure(string procedureName, params object[] parameters)
{
// 实现存储过程执行逻辑,此处省略具体代码
}
}
3.2 数据库连接和关闭
3.2.1 连接池的概念及优势
数据库连接池(Connection Pool)是一个存储在内存中的数据库连接的集合。它允许应用程序重复使用现有的数据库连接,而不是为每个数据库请求打开和关闭新的连接。这样可以大大减少数据库连接创建和销毁的开销,从而提高应用程序性能。
连接池的优势包括:
- 减少资源消耗 :通过重用数据库连接,减少了资源消耗。
- 提高性能 :连接池提供快速访问数据库的能力。
- 管理方便 :通过连接池可以更好地管理数据库连接,例如设置最大连接数。
3.2.2 安全关闭数据库连接的策略
数据库连接在使用完毕后应该被正确关闭,以释放服务器资源。正确的关闭数据库连接的策略包括:
- 使用
using
语句:确保IDisposable
对象(如SqlConnection
、SqlCommand
)被正确释放。 - 使用连接池:让数据库连接池管理连接的生命周期。
- 显式关闭连接:在
finally
块中确保连接被关闭,即使发生异常也是如此。
以下是一个使用 using
语句安全关闭连接的示例代码:
using (var connection = new SqlConnection(_connectionString))
{
connection.Open();
using (var command = new SqlCommand(query, connection))
{
// 执行数据库操作
}
// connection 和 command 在此处会自动被释放
}
// 在 using 块结束时,连接会被自动关闭
3.3 SQL命令执行
3.3.1 执行单条SQL语句的方法
执行单条 SQL 语句通常用于插入、更新或删除操作。在 DbHelperMySQL
类中,可以定义一个 ExecuteNonQuery
方法来执行这些操作。以下是这个方法的一个基本实现:
public void ExecuteNonQuery(string sql)
{
using (var connection = new SqlConnection(_connectionString))
{
connection.Open();
using (var command = new SqlCommand(sql, connection))
{
command.ExecuteNonQuery();
}
}
}
3.3.2 执行存储过程和函数的方法
执行存储过程和函数时,通常会涉及输入、输出参数或返回值。 DbHelperMySQL
类中的 ExecuteProcedure
方法可以用来执行这些操作。方法实现可能如下:
public void ExecuteProcedure(string procedureName, params object[] parameters)
{
using (var connection = new SqlConnection(_connectionString))
{
connection.Open();
using (var command = new SqlCommand(procedureName, connection))
{
***mandType = CommandType.StoredProcedure;
foreach (var parameter in parameters)
{
command.Parameters.Add(parameter);
}
command.ExecuteNonQuery();
}
}
}
在使用存储过程时,需要注意参数的正确配置,包括参数的名称、类型、方向(输入、输出或输入输出),以及可能的默认值。这些参数配置确保了存储过程能够正确执行并返回期望的结果。
结语
在本章节中,我们深入探讨了 DbHelperMySQL
类封装的必要性和优势,了解了如何通过它来管理数据库连接,并且展示了如何安全地执行 SQL 命令。通过具体的代码示例和执行逻辑,我们对框架的使用有了更深刻的理解。在下一章节中,我们将继续探索事务处理机制与异常捕获的重要性,以及如何通过优化连接池来提升数据库操作的性能。
4. 事务处理机制与异常捕获
4.1 事务处理机制
4.1.1 事务的基本概念和ACID属性
在数据库系统中,事务是一组操作的集合,这些操作要么全部成功,要么全部失败。这组操作具有四个基本属性,通常称为ACID属性,分别是原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持久性(Durability)。理解这些属性对于设计和维护数据完整性至关重要。
- 原子性 :事务是最小的工作单元,不可分割。要么全部执行,要么全部不执行。
- 一致性 :事务必须使数据库从一个一致性状态转换到另一个一致性状态。
- 隔离性 :并发执行的事务之间不应互相影响。
- 持久性 :一旦事务提交,所做的改变就是永久性的。
在C#中使用MySQL数据库时,事务通过 MySqlConnection
和 MySqlCommand
类来实现。我们可以使用事务对象来控制事务的开始、提交或回滚。
4.1.2 实现事务的代码示例
下面是一个简单的示例代码,展示如何在C#中使用MySQL数据库进行事务处理:
using (MySqlConnection conn = new MySqlConnection(connectionString))
{
conn.Open();
// 创建事务
MySqlTransaction transaction = conn.BeginTransaction();
try
{
// 创建命令对象
MySqlCommand command1 = conn.CreateCommand();
command1.Transaction = transaction;
***mandText = "UPDATE table1 SET Column1 = 'UpdatedValue1' WHERE Id = 1";
MySqlCommand command2 = conn.CreateCommand();
command2.Transaction = transaction;
***mandText = "UPDATE table2 SET Column2 = 'UpdatedValue2' WHERE Id = 2";
// 执行命令
command1.ExecuteNonQuery();
command2.ExecuteNonQuery();
// 提交事务
***mit();
}
catch (Exception ex)
{
// 回滚事务
transaction.Rollback();
Console.WriteLine("An exception occurred: " + ex.Message);
}
}
在此示例中,我们首先建立了数据库连接,并创建了一个事务对象。然后创建了两个 MySqlCommand
对象,并将它们与事务关联起来。执行了两个更新命令后,我们提交了事务,这表示所有的命令都成功执行。如果在执行过程中遇到异常,我们将回滚事务,这样数据库将不会保存任何更改。
4.2 异常捕获与处理
4.2.1 异常处理的策略和实践
在处理数据库操作时,异常处理是一个关键方面。正确的异常处理策略可以提高程序的健壮性和用户满意度。C#通过 try...catch
和 finally
块来处理异常。
- try块 :包含可能引发异常的代码。
- catch块 :处理try块中发生的异常。可以有多个catch块来处理不同类型的异常。
- finally块 :无论是否发生异常,finally块中的代码总是执行。它通常用于清理资源,比如关闭数据库连接。
在实际应用中,应该遵循以下策略:
- 捕获特定的异常,而不是使用通用的
Exception
类。 - 在catch块中不要执行复杂的逻辑,因为此时程序状态可能不完全。
- 使用finally块释放资源,如数据库连接。
- 记录异常信息,但要注意不要记录敏感信息。
4.2.2 自定义异常类及应用
在某些情况下,内置的异常类可能不能完全符合特定的需求。这时,可以创建自定义异常类来提供更具体的信息或行为。
下面是一个简单的自定义异常类示例:
public class CustomDatabaseException : Exception
{
public CustomDatabaseException(string message) : base(message)
{
}
public CustomDatabaseException(string message, Exception innerException) : base(message, innerException)
{
}
public override void GetObjectData(SerializationInfo info, StreamingContext context)
{
// 可以添加序列化逻辑
base.GetObjectData(info, context);
}
}
自定义异常类可以像使用内置异常类一样使用。在上面的事务处理示例中,如果有必要,我们可以抛出 CustomDatabaseException
来代替通用的 Exception
类:
catch (MySqlException ex)
{
throw new CustomDatabaseException("A database error occurred.", ex);
}
这样做可以提供更清晰的错误信息,同时允许调用者通过捕获特定类型的异常来进行更详细的错误处理。
在本章节的介绍中,我们深入了解了事务处理机制和异常捕获技术。通过使用ACID属性来保证数据的完整性,以及通过try-catch-finally结构来优雅地处理运行时可能出现的错误,我们能够使我们的应用程序更加健壮和可靠。自定义异常类为错误处理提供了更大的灵活性,使我们能够以更细粒度的方式表达和处理特定的错误情况。接下来,我们将转向连接池的优化,以及如何在项目中使用封装类库来进一步提升应用程序的性能和可维护性。
5. 连接池优化与封装类库应用
在数据库交互中,连接池优化与封装类库的应用是提升系统性能和开发效率的重要手段。本章节将详细介绍连接池的优化方法以及封装类库的使用场景和示例。
5.1 连接池优化
5.1.1 连接池的配置与监控
连接池是数据库连接的一个缓存,它可以减少应用程序创建和销毁数据库连接所需的资源和时间。在.NET中, MySqlConnector
和 MySql.Data
是常用的两个库,它们提供了连接池功能。
配置连接池时,需要注意如下参数:
-
MinimumPoolSize
: 最小连接池大小。 -
MaximumPoolSize
: 最大连接池大小。 -
ConnectionIdleTimeout
: 连接在池中空闲的最大时间,超过该时间未使用将被销毁。
以下是一个配置连接池大小的代码示例:
var builder = new MySqlConnectionStringBuilder
{
Server = "localhost",
UserID = "root",
Password = "yourpassword",
Database = "yourdatabase",
MinimumPoolSize = 1,
MaximumPoolSize = 100,
ConnectionIdleTimeout = 10 // 10秒
};
using var connection = new MySqlConnection(builder.ConnectionString);
connection.Open();
监控连接池的状态对于维护数据库性能至关重要。可以通过查看 MySql.Data.MySqlClient.MySqlConnection
的 Pool
属性来获取连接池的使用信息。
5.1.2 连接池性能问题分析与解决方案
性能问题通常表现在连接耗尽、长时间等待连接等方面。分析这些问题是优化连接池性能的关键。
当连接耗尽时,可能是因为 MaximumPoolSize
设置过小,或者数据库服务器能够承载的连接数有限。通过调整连接池配置或者升级数据库服务器来解决。
长时间等待连接的问题通常由于锁竞争导致。可以考虑使用 ConnectionLifetime
来定期更换连接,从而减少长时间持有连接带来的风险。
5.2 封装类库在项目中的应用
5.2.1 封装类库的引入和配置
封装类库可以简化数据库操作,并提供一致的接口。以 DbHelperMySQL
类库为例,我们可以将其引入到项目中,并进行配置。
以下是如何在项目中引入和配置封装类库的步骤:
- 添加对
DbHelperMySQL.dll
的引用。 - 在项目的配置文件中添加连接字符串。
- 在程序启动时初始化
DbHelperMySQL
对象。
public static class DbHelperMySQL
{
private static MySqlConnection connection;
public static void Initialize(string connectionString)
{
connection = new MySqlConnection(connectionString);
}
public static T ExecuteScalar<T>(string query)
{
// 方法实现代码...
}
// 其他方法...
}
在 App.config
中配置数据库连接字符串:
<configuration>
<connectionStrings>
<add name="MySqlConnection" connectionString="Server=localhost;Database=yourdatabase;Uid=root;Pwd=yourpassword;"/>
</connectionStrings>
</configuration>
5.2.2 实际项目中封装类库的使用示例
DbHelperMySQL
封装类库提供了一个简化数据库操作的统一接口。使用示例如下:
DbHelperMySQL.Initialize(ConfigurationSettings.AppSettings["MySqlConnection"].ToString());
// 查询数据
var userId = 1;
var userName = DbHelperMySQL.ExecuteScalar<string>("SELECT name FROM users WHERE id = @userId", new { userId });
// 更新数据
var newUserName = "New Name";
DbHelperMySQL.Execute("UPDATE users SET name = @newName WHERE id = @userId", new { newUserName, userId });
// 插入数据
var newUser = new { name = "John Doe", email = "***" };
DbHelperMySQL.Insert("INSERT INTO users (name, email) VALUES (@name, @email)", newUser);
// 删除数据
var deleteUser = 1;
DbHelperMySQL.Delete("DELETE FROM users WHERE id = @deleteUser", new { deleteUser });
通过封装类库的使用,可以大大简化数据库操作代码,提高代码的可维护性和可重用性。
简介:本文讲解了如何利用C#语言和***框架实现与MySQL数据库的增、删、查、改(CRUD)操作,并封装成易于使用的类库。文中详细介绍了数据库连接、SQL语句执行、事务处理、异常处理、连接池技术以及如何封装这些操作,最终提供了一个名为 DbHelperMySQL.cs
的类库。