如何编写一个事务来覆盖移动文件和在数据库中插入记录?

我想要一个事务来复制文件,然后在数据库中插入一个记录。 类似下面的语句,但事务不包括复制文件。 解决方案是什么?

using (TransactionScope scope1 = new TransactionScope()) { // Copy a file fileMgr.Move(srcFileName, destFileName); // Insert a database record dbMgr.ExecuteNonQuery(insertSql); scope1.Complete(); } 

尝试使用.NET Transactional文件管理器

这个库允许你在这样的事务中包装文件系统操作:

 // Wrap a file copy and a database insert in the same transaction TxFileManager fileMgr = new TxFileManager(); using (TransactionScope scope1 = new TransactionScope()) { // Copy a file fileMgr.Copy(srcFileName, destFileName); // Insert a database record dbMgr.ExecuteNonQuery(insertSql); scope1.Complete(); } 

较新版本的Windows具有可以使用的称为TxF(事务性NTFS)的东西。 这里有一个代码示例: WINDOWS VISTA – 在C#中引入TXF(第2部分) – 使用SYSTEM.TRANSACTIONS和DTC (我很抱歉大写锁定,但页面的标题是:-))

您必须使用MoveFileTransacted而不是DeleteFileTransactioned 。 一旦你进入DTC,你的SQL连接应该注册到它,所以一切都应该是一个大的事务。

您可以手动滚动自己的文件事务,如果提交失败,请将文件移回其原始位置

 using (TransactionScope scope1 = new TransactionScope()) { // Copy a file fileMgr.Move(srcFileName, destFileName); try { // Insert a database record dbMgr.ExecuteNonQuery(insertSql); scope1.Complete(); } catch (Exception) { fileMgr.Move(destFileName, srcFileName); } } 

我不是100%用于确定是否发生错误提交事务的语法,但我认为这说明了这个概念