【问题标题】:Error in operating on big database大数据库操作出错
【发布时间】:2013-09-06 05:13:05
【问题描述】:

我正在尝试按 ID 删除 .mdb 文件中的表行,但是在处理大型 .mdb 文件(大小为 35 MB 或更大)时会出现异常。例外是“System resources exceeded (3035)”。

但是在处理小文件时没有问题。

连接是通过使用CDaoDatabse实现的,它代表了一个到数据库的连接,通过它可以对数据进行操作。并且程序是用C++编写的。

一段代码如下所示:

CDaoDatabase* pDatabase
BeginTransaction(pDatabase);

  try
    {
    sSQL.Format("Delete from %s where %s = %d",DaoTrianglesTable,DaoObjectIdField,nObjectId);
    pDatabase->Execute(sSQL);
    }
  catch(CDaoException* e)
    {        
    DisplayDaoException(e);
    EndTransaction(pDatabase,false);      
    }  
EndTransaction(pDatabase,true);  

请注意,如果我删除函数 BeginTransaction()EndTransaction() 并运行程序,则没有问题。但是,我不确定这是正确的解决方案,是否有任何替代解决方案?有没有人遇到过这种情况?

【问题讨论】:

    标签: c++ ms-access exception-handling database-connection


    【解决方案1】:

    首先,35MB 的 Access 数据库确实不算大,实际上有点小。

    但是,在执行事务时,Access 会跟踪所有已删除的数据,如果您要删除很多数据,您可能会超过 Access 在事务期间使用的锁数。

    请看以下内容:

    如果您执行大量循环连接/断开 Access 数据库,可能会出现的另一个问题是,在您尝试再次连接到数据库之前,锁定文件可能无法足够快地释放。
    在这种情况下,只需确保保持与数据库的连接,并保持打开状态,直到完全完成。

    您也可以将dbFailOnError 添加到Execute(),而不是使用事务。 另一种方法是完全取消事务,首先制作数据库副本作为备份,执行删除操作,如果出现大问题则手动恢复数据库。

    但在大多数情况下,我从未见过数据库在 DELETE 操作期间失败,除非表之间的关系具有复杂的级联更新/删除,这可能会在其他约束中造成失败。

    【讨论】:

    • 您的第一个变体是正确的。我们尝试直接在 Access 中运行 SQL 查询并收到以下消息“没有足够的内存来撤消此事务,您还想继续此查询吗?”这解释了为什么删除开始/结束事务调用可以解决问题
    【解决方案2】:

    Access 2010 的修补程序:http://support.microsoft.com/kb/2726928 在 Access 2010 中执行查询时出现“系统资源超出”错误消息

    日期为 2012 年 10 月 30 日。您的里程可能会有所不同。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-07-06
      • 1970-01-01
      • 2016-09-14
      • 1970-01-01
      • 2021-01-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多