背景
在数据库中使用事务(Transaction)可以确保多个 SQL 操作要么全部成功,要么全部失败。为了实现所需的效果(插入和更新),可以将两个 SQL 语句包装在一个事务中。在事务中执行时,如果出现任何错误,可以回滚事务,确保数据库状态的一致性
代码示例
public string GetRepaired(dynamic obj)
{
// 设置数据库连接字符串
DbHelperSQL.connectionString = Const.g_Sqlstring;
// 开始事务
using (var connection = new SqlConnection(DbHelperSQL.connectionString))
{
// 打开连接
connection.Open();
// 开始一个事务
using (var transaction = connection.BeginTransaction())
{
try
{
// 查 产线和轧辊类型
string str = $"SELECT Line, RollType FROM [JT_DX_RollShop].[dbo].[Bearing] WHERE BearingID = '{obj.data.BearingID}'";
DataTable dt = DbHelperSQL.Query(str, transaction); // 使用事务对象传递给查询
string Line = dt.Rows[0]["Line"].ToString();
string RollType = dt.Rows[0]["RollType"].ToString();
// 插入问题解决记录
string insertSql = $"INSERT INTO [dbo].[ProblemSolution] " +
$"([BearingID], [Date], [Recorder], [Unit], [problem], [status], [Line], [RollType]) " +
$"VALUES ('{obj.data.BearingID}', '{obj.data.Date}', '{obj.data.Recorder}', '{obj.data.Unit}', '{obj.data.problem}', '{obj.data.status}', '{Line}', '{RollType}')";
// 执行插入
DbHelperSQL.ExecuteNonQuery(insertSql, transaction); // 使用事务执行
// 更新 Bearing 表状态
string updateSql = $"UPDATE [JT_DX_RollShop].[dbo].[Bearing] " +
$"SET State = '检修完' " +
$"WHERE BearingID = '{obj.data.BearingID}'";
// 执行更新
DbHelperSQL.ExecuteNonQuery(updateSql, transaction); // 使用事务执行
// 提交事务
transaction.Commit();
// 如果事务成功提交,返回成功状态
return "操作成功";
}
catch (Exception ex)
{
// 出现异常时回滚事务
transaction.Rollback();
// 返回异常信息或处理异常
return $"操作失败: {ex.Message}";
}
}
}
}
代码解析
-
打开数据库连接并开始事务:
- 使用
SqlConnection
对象连接数据库。 - 使用
connection.BeginTransaction()
开始一个事务。
- 使用
-
查询产线和轧辊类型:
DbHelperSQL.Query()
方法是查询数据库的,传入了事务对象transaction
,以确保查询操作也在事务范围内执行。
-
插入数据:
- 使用
DbHelperSQL.ExecuteNonQuery()
执行 SQL 插入操作,并传入事务对象transaction
,确保插入操作也在事务内。
- 使用
-
更新数据:
- 同样,使用
DbHelperSQL.ExecuteNonQuery()
执行 SQL 更新操作,并传入事务对象。
- 同样,使用
-
提交事务:
- 如果没有发生异常,调用
transaction.Commit()
提交事务,所有操作将永久生效。
- 如果没有发生异常,调用
-
异常处理与回滚事务:
- 如果在任何一个操作中发生异常,会捕获该异常并调用
transaction.Rollback()
来回滚事务,这样就不会对数据库产生部分更改。
- 如果在任何一个操作中发生异常,会捕获该异常并调用
-
返回状态:
- 如果操作成功,返回
"操作成功"
;如果发生异常,返回异常信息。
- 如果操作成功,返回
DbHelperSQL
方法的修改
确保 DbHelperSQL.Query()
和 DbHelperSQL.ExecuteNonQuery()
方法支持传入事务对象。你可以通过以下方式对这些方法进行修改:
public static DataTable Query(string sql, SqlTransaction transaction)
{
using (var cmd = new SqlCommand(sql, transaction.Connection, transaction))
{
using (var da = new SqlDataAdapter(cmd))
{
DataTable dt = new DataTable();
da.Fill(dt);
return dt;
}
}
}
public static int ExecuteNonQuery(string sql, SqlTransaction transaction)
{
using (var cmd = new SqlCommand(sql, transaction.Connection, transaction))
{
return cmd.ExecuteNonQuery();
}
}
这样,所有数据库操作都在同一个事务内执行,确保了数据的一致性和完整性