Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/297.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何编写一个事务来覆盖移动文件和在数据库中插入记录?_C#_Asp.net - Fatal编程技术网

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

C# 如何编写一个事务来覆盖移动文件和在数据库中插入记录?,c#,asp.net,C#,Asp.net,我想有一个事务来复制一个文件,然后在数据库中插入一条记录。 类似于下面的语句,但事务不包括复制文件。 解决办法是什么 using (TransactionScope scope1 = new TransactionScope()) { // Copy a file fileMgr.Move(srcFileName, destFileName); // Insert a database record dbMgr.ExecuteNonQuery(insertSql

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

using (TransactionScope scope1 = new TransactionScope())
{
    // Copy a file
    fileMgr.Move(srcFileName, destFileName);

    // Insert a database record
    dbMgr.ExecuteNonQuery(insertSql);

    scope1.Complete();
}

较新版本的Windows有一种称为TxF(事务性NTFS)的东西,您可以使用它。这里有一个代码示例:(很抱歉大写锁定,但是页面的标题是:-))


您必须使用而不是
deletefiletransaction
。一旦遇到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%支持用于确定提交事务时是否发生错误的语法,但我认为这说明了尝试使用的概念

此库允许您在事务中包装文件系统操作,如下所示:

// 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();
} 

在使用
事务性NTFS
或任何其他建议之前,请先阅读本文:

TxF是一组复杂而细微的API,第三方应用程序不常用这些API。由于这些API可能无法在未来的Windows版本中使用,并且有更简单的替代方法来实现TxF开发的许多场景,Microsoft强烈建议开发人员研究这些替代方法,而不是在其应用程序中创建对TxF的依赖


实现ACID的一个更好的方法是使用你所要求的是可以理解的。你更害怕文件移动或插入失败吗?@DavidePiras放弃这个。。。是TxR(事务处理注册表)与SQL不兼容。是的,它应该可以工作。有关TxF的.Net包装器,请参阅。实际上非常简单,可以轻松集成到项目中。MS警告不要使用TxF,因为它可能会从未来的操作系统中删除:。某些TxF功能在Windows8中已经被弃用:虽然当时还可以,但现在可能已经过时了@MickyDuncan是的,不幸的是,TxF是一种已经进入死亡螺旋的技术:-(您应该将
exeetenonquery
移动到
try
中,这并不保证在失败时恢复初始状态。例如,destFileName可能由另一个文件填充。此库不是事务性NTFS的包装器。它只是实现
IEnlistmentNotification
并允许手动执行标准文件使用
TransactionScope
的操作。例如,要对现有文件启用写操作回滚,它首先创建要写入的文件的备份,然后写入备份文件,最后在提交事务时用备份/修改的文件替换初始文件,或删除备份如果事务被回滚,则返回文件。这与事务性NTFS无关。还要注意,lib的作者对此非常清楚。如果您想在.Net中使用事务性NTFS,请参阅。我对此很谨慎,因为更新很少,但鉴于TxF已退出菜单(请参阅我对xanatos的评论),这似乎是最好的解决方案(对我来说)。如何使用该库创建新文件?我只有字节[]需要在事务中创建该文件。谢谢,@Damith。我也对一个重复问题的答案发表了评论:Tx文件管理器库的github和nuget版本不同:github版本包括
文件。WriteAllBytes
,而nuget版本不包括。您可以在这里获得github版本: