-1

我想读取一个巨大的目录及其子目录和文件,然后写入数据库。一切都很好,但我在一个表上放置了一个触发器,当插入数据并更新另一个表时它会被触发。触发器与单个 sql 工作正常命令但

由于主程序中的过程较长,因此不会触发触发器。我正在使用 queue dequeue 和 backroundworker 线程。(c#)

如何解决这个问题。任何想法都值得赞赏。

4

1 回答 1

0

我假设触发器工作正常,但您需要在看到触发器效果发生之前处理所有数据。因此,我建议您将数据拆分成更小的块(批次),然后将它们一个一个地插入到数据库中。基本上,选择最适合您的设置的批次大小并在迭代中加载数据。

下面是一些示例 C# 代码:

public void ProcessData(String rootDirectory, int batchSize) 
{
    IEnumerable<string> pathsToProcess = GetPathsToProcess(rootDirectory);

    int currentBatch = 0;
    while (currentBatch*batchSize < pathsToProcess.Length) 
    {
        // take a subset of the paths to process
        IEnumerable<string> batch = pathsToProcess
            .Skip(currentBatch*batchSize)
            .Take(batchSize);

        DoYourDatabaseLogic(batch);

        currentBatch++;
    }
}

上面的代码将为较小的数据子集执行数据库操作,之后您的触发器将针对该数据执行。每个批次都会发生这种情况。您仍然需要等待所有批次完成,但您可以看到已完成批次的更改。

然而,使用这种方法会带来一个需要担心的重要问题:如果某些批次由于某种原因失败会发生什么?

  • pathsToProcess如果您必须在单个批次/子集失败时恢复整个集合的所有更改,您应该组织上述代码在单个数据库事务中运行,并确保适当地进行回滚。
  • 如果pathsToProcess集合不需要完全回滚,我仍然建议在每个批次上使用事务。在这种情况下,您可能需要知道您最后一次成功写入了哪个批次,以便在要再次处理数据时从中恢复。
于 2013-11-11T12:00:56.727 回答