如何复制文件并将SQL数据库更新为单个事务?

时间:2017-03-30 13:36:30

标签: c# database file transactions

我的应用程序需要监视文件夹到传入文件,当它注意到新文件到达时,我需要将它复制到另一个位置并将记录插入SQL数据库。

问题在于这两个行为是独立的,并且不能作为交易一起成功或失败。

有没有办法解决这个问题?

一种选择是首先更新SQL然后复制该文件然后更新SQL,如果失败则删除该文件,但删除操作也会失败,导致两个操作都不同步。

有一个名为Transactional NTFS的系统,但Microsoft建议不要使用它。

2 个答案:

答案 0 :(得分:0)

你应该

  1. 创建数据库事务
  2. 创建文件系统事务
  3. 执行数据库操作,而不提交事务
  4. 执行文件系统操作
  5. 提交数据库事务和文件系统事务(如果一切正常),如果出现问题则回滚(r)。
  6. 我建议为文件系统事务http://transactionalfilemgr.codeplex.com/检查此类似的东西。

答案 1 :(得分:0)

我认为你不需要交易。您可以使用function for 2.x监视文件夹中的传入文件。复制文件后,执行数据库操作。

FileSystemWatcher示例

FileSystemWatcher watcher;

private void Watch()
{
  watcher = new FileSystemWatcher();
  watcher.Path = path;
  watcher.NotifyFilter = NotifyFilters.LastAccess | NotifyFilters.LastWrite
                         | NotifyFilters.FileName | NotifyFilters.DirectoryName;

  watcher.Filter = "*.*";
  watcher.Changed += new FileSystemEventHandler(OnChanged);
  watcher.EnableRaisingEvents = true;
}

private void OnChanged(object source, FileSystemEventArgs e)
{
   CopyFile(e.FullPath);
}

private void CopyFile(string fileNameAndPath)
{
   // copy file
   // make sure file exists at new  location
   // perform database operation
}