在C#中使用长过程调用数据库触发器

自由人

我想读取一个巨大的目录及其子目录和文件,然后将其写入数据库。一切都很好,但是我在插入数据的表上放置了一个触发器,并更新了另一个表。使用单个sql触发就可以了命令但是

由于主程序中的过程很长,因此不会触发触发器。我正在使用队列出队和backroundworker线程。(C#)

这个问题怎么解决?

伊瓦洛·斯拉沃夫(Ivaylo Slavov)

我认为触发器工作正常,但是您需要先处理所有数据,然后才能看到触发器效果。因此,我建议您将数据分成较小的部分(批),然后将它们一一插入到数据库中。基本上,选择最适合您的设置的批处理大小,并在迭代中加载数据。

这是一些示例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不需要集合完全回滚,我仍然建议在每个批次上使用事务。在这种情况下,您可能需要知道您最后一次成功写入了哪个批处理,以便在要再次处理数据时从中恢复。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

使用Firebase数据库触发器onUpdate

数据库多表触发器

SQL触发器数据库

如何防止从触发器或存储过程保存到数据库?

如何从SQLite数据库的新记录中获取char数据类型的字段,以及使用dapper + c#由触发器生成的字段

在mysql中使用webscraper为数据库插入编写触发器....不断出现不同的错误

是否有可能在数据库触发器中使用多个 Before 或 After 语句

在Access数据库(mdb文件)中使用Jet表时,触发器的替代方法是什么?

如何在触发器调用的过程中使用COMMIT

Firebase数据库触发器-如何等待调用

是否可以从其他数据库表中的触发器调用 UDF?

是否可以从Java代码调用数据库触发器?

更新后在DML触发器中调用对象成员函数(ORACLE数据库)

如何使用触发器调用过程

如何使用Firebase Cloud函数http触发器从Firebase数据库获取数据

不使用数据库触发器就无法使用Firebase云功能更新Firebase数据库

Firebase数据库是否提供事件,触发器和存储过程等功能?

使用插入时使用触发器更新数据库

插入触发器时数据库phpmyadmin

在PHP的何处放置数据库事件触发器?

用于Firebase数据库的Cloud Functions触发器?

在GoSQL中处理数据库触发器

Firebase数据库触发器:onCreate,onUpdate,onDelete

触发器阻止数据库项目发布

获取数据库表的触发器名称

OnUpdate Firebase数据库触发器

postgres 9.3数据库触发器创建

通过数据库触发器推送消息?

Mariadb 数据库级触发器