首页 新闻 搜索 专区 学院

【求助】C#怎样控制SQL执行和移动文件在同一个事务执行

0
悬赏园豆:5 [已解决问题] 解决于 2018-06-27 10:48

public bool ExecuteSqlsWithTransaction(string[] cmdTexts, Func<bool>[] funcs)
{
if (cmdTexts.Length == 0)
{
return false;
}

using (MySqlConnection connection = new MySqlConnection(connStr))
{
connection.Open();
MySqlTransaction trans = connection.BeginTransaction();
foreach (var sql in cmdTexts)
{
using (MySqlCommand cmd = new MySqlCommand(sql, connection, trans))
{
try
{
LoggerManager.Info(string.Format("执行SQL:{0}", sql));
int rows = cmd.ExecuteNonQuery();
if (rows != 1)
{
trans.Rollback();
LoggerManager.Error("批量执行sql语句失败,事务回滚", null);

return false;
}
LoggerManager.Info(string.Format("影响行数为:{0}", rows));
}
catch (Exception ex)
{
trans.Rollback();
LoggerManager.Error("批量执行sql语句失败,事务回滚", ex);
throw;
}
}
}

if (funcs != null)
{
foreach (Func<bool> func in funcs)
{
//执行方法失败,回滚事务
if (!func())
{
trans.Rollback();

LoggerManager.Error(string.Format("批量执行{0}操作失败,事务回滚", func.Method.Name), null);
return false;
}
}
}

trans.Commit();
LoggerManager.Info("批量执行sql语句成功,事务提交");
return true;
}
}

 

上面我写的这个方法只能执行没有参数的方法,如果有参数呢?我知道可以 Func<int,bool>[] funcs    可是如果参数数量和类型都不确定呢?我想写个通用的这种方法

Dellienware的主页 Dellienware | 初学一级 | 园豆:39
提问于:2016-11-28 17:38
< >
分享
最佳答案
0

1.先开始事务

2.执行SQL

3.移动文件夹。

4-1.如果移动文件夹失败则事务回滚

4-2.如果移动文件夹成功则事务提交

5.如果事务提交失败则还原文件夹移动

收获园豆:5
Zachary_Fan | 小虾三级 |园豆:762 | 2016-12-05 20:16
其他回答(4)
0

Func<int,object> or Func<int,<T>>;

如果成功这执行移动文件夹;如果移动文件夹失败想办法恢复就行了

花飘水流兮 | 园豆:11023 (专家六级) | 2016-11-28 17:47

我想移文件夹失败就回滚SQL啊

支持(0) 反对(0) Dellienware | 园豆:39 (初学一级) | 2016-11-28 21:38

@Dellienware: 把移动文件移到一个class中来,让这个class实现IEnlistmentNotification接口,实现其Prepare,Commit,Rollback,InDoubt方法。暴露移动文件的方法出来。最后实现类似下面

using(var ts=new TransactionScope())

{

  var yourFileManger=....;

  yourFileManager.MoveFiles();

  //..your db operations;

  ts.Complete();

}

支持(0) 反对(0) Daniel Cai | 园豆:10374 (专家六级) | 2016-11-29 09:17
0

文件操作不支持事务。

Daniel Cai | 园豆:10374 (专家六级) | 2016-11-28 17:48
0

移动失败就回滚。

terry59599s | 园豆:202 (菜鸟二级) | 2016-12-17 08:00
0

关键是,你可以把移动文件写到transaction里面,失败才能回滚,成功则在transaction最后面提交。失败可以抛异常,在catch里回滚,或者用if判断进行回滚都可以

jmlsaul | 园豆:247 (菜鸟二级) | 2017-08-31 09:02
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册