Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/319.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# 如何将文件复制并作为单个事务更新SQL数据库?_C#_Database_File_Transactions - Fatal编程技术网

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

C# 如何将文件复制并作为单个事务更新SQL数据库?,c#,database,file,transactions,C#,Database,File,Transactions,我的应用程序需要监视一个文件夹中的传入文件,当它注意到一个新文件已到达时,我需要将其复制到另一个位置,并将一条记录插入SQL数据库 问题是这两个操作是独立的,不能作为一个事务一起成功或失败 有什么办法可以解决这个问题吗 一个选项是先更新SQL,然后复制文件,然后更新SQL,如果失败,则删除文件,但删除操作也可能失败,导致两个操作不同步 有一个名为事务性NTFS的系统,但Microsoft建议不要使用它。您应该 创建数据库事务 创建文件系统事务 执行数据库操作,而不提交事务 执行文件系统操作 提交

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

问题是这两个操作是独立的,不能作为一个事务一起成功或失败

有什么办法可以解决这个问题吗

一个选项是先更新SQL,然后复制文件,然后更新SQL,如果失败,则删除文件,但删除操作也可能失败,导致两个操作不同步

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

您应该

  • 创建数据库事务
  • 创建文件系统事务
  • 执行数据库操作,而不提交事务
  • 执行文件系统操作
  • 提交数据库事务和文件系统事务如果都正常,则在出现问题时回滚这两个事务(r)

  • 我建议为文件系统事务检查此项或类似项。

    我认为您不需要事务。您可以使用监视文件夹中的传入文件。复制文件后,执行数据库操作

    文件系统观察程序示例

    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
    }
    

    通过sql连接打开事务,执行更新,如果确定,则执行副本,如果确定,则提交事务。其他所有内容回滚您可以在文件系统中执行事务,而无需事务性NTFS,但不能执行开箱即用的任务。如果您的文件操作仅包含一个文件副本,那么我不明白您为什么认为有必要执行“事务”。你能解释一下吗?