对于ACCESS数据库,如果通过大量的SQL来操作数据库或者直接操作大量的数据时,经常会出现这种错误:

"文件共享锁定数溢出"

原因如下:
    Access数据库,同时操作大量记录(9500条以上)时报错(这是指9500条SQL语句而不是数据的记录数)。
    Microsoft JET Database Engine 错误'80040e21'

解决办法:

修改注册表

[HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Jet/4.0/Engines/Jet4.0]
   "MaxLocksPerFile"=dword:05f5e0ff

这里需要注意的地方是这位置是32位系统的位置,而对于64位系统所对应的注册表的位置是不同的。

[HKEY_LOCAL_MACHINE/SOFTWARE/Wow6432Node/Microsoft/Jet/4.0/Engines/Jet 4.0]

另一种解决方案:

如果SQL数据量太大(例如:超过60W)的话,经测试即使修改了注册表信息,也无法实现,为此需要另一种解决方案。

1:首先,复制当前的ACCESS数据库到一个特定的目录下(用于出现异常时,好恢复数据库)。

2:设置SQL语句每次提交的数量(一般为2W),也就是每2W条SQL语句提交一次(防止出现文件共享锁定数溢出)。

3:如果在执行SQL语句的过程中出现异常,用备份的数据库覆盖原数据库。

注意:这个过程中,各个的衔接要多注意。

代码示例:

//1:备份当前的数据库到【BACKUPDB】下
            string strAppDir = System.AppDomain.CurrentDomain.BaseDirectory;
            string dbDirFileStr = strAppDir + "DBdata\\EduDB.mdb";//原数据库文件
            string backupDbDir = strAppDir + "BACKUPDB";
            DirectoryInfo directoryInfo = new DirectoryInfo(backupDbDir);
            if (!directoryInfo.Exists)
            {
                directoryInfo.Create();
            }
            //设置文件隐藏
            File.SetAttributes(backupDbDir,FileAttributes.Hidden);
            //是否存在相同的文件,存在就删除
            string backupDbDirFileStr = backupDbDir + "\\EduDB.mdb";
            FileInfo dbFileInfo = new FileInfo(backupDbDirFileStr);
            if (dbFileInfo.Exists)
                System.IO.File.Delete(backupDbDirFileStr);
            IOTool.CopyFiles(dbDirFileStr, backupDbDirFileStr, true);

//2:设置每10000条SQL语句,做一次提交
            try
            {
                        for (int j = 0; j <count; j++)
                        {
                            //拼接的SQL语句
                            if (j!=0 && j%20000 == 0)
                            {
                                commitNum++;
                                DbBusHelp.ExecuteSqlTran(SQLStringList);
                                SQLStringList.Clear();
                            }
                         }

//不足2W条SQL语句数
                         DbBusHelp.ExecuteSqlTran(SQLStringList);
                         SQLStringList.Clear();   
                     }
                }
            }
            catch (Exception ex)
            {
                CCLib.MV.LogTool.WriteEduAppLog(ex.Message, ex.StackTrace);
                //3:出现异常,把备份的数据库恢复,是否关闭数据库连接
                IOTool.CopyFiles(backupDbDirFileStr, dbDirFileStr, true);
                return false;
            }

Acess错误:"文件共享锁定数溢出"的更多相关文章

  1. 文件共享锁定数溢出-IWorkspaceEdit.StopEditing

    在批量保存Feature至本地mdb的时候,当Feature的数量超过一定的值(该值不确定是不是Access文件的MaxLocksPerFile值,因为当MaxLocksPerFile为9500时,F ...

  2. Excel(Access)文件共享锁定数溢出(Error 3052)的解决方法

    Excel或Access均可能会提示:文件共享锁定数溢出(Error 3052),主要版本为office 2003,在其他版本上未遇到.错误提示如下: Microsoft JET Database E ...

  3. ArcGIS中文件共享锁定数据溢出 这个方法不行,建议用gdb,不要用mdb

    ArcGIS中文件共享锁定数据溢出 (2011-11-24 15:52:41) 转载▼ 标签: 杂谈 分类: GIS 文件共享锁定数溢出.(Error 3052)1. Access数据库,同时操作大量 ...

  4. 由于没有发现潜在的递归导致MySQL链接数溢出:MySQLNonTransientConnectionException: Data source rejected establishment of connection, message from server: "Too many connec

    DAOProxy的代码:下面代码中红色高亮的就是出问题的地方,DAOFactory中会构造一个PersonDAOProxy,调用listPersons或者addPerson显然会导致递归,从而导致My ...

  5. Android日志打印类LogUtils,能够定位到类名,方法名以及出现错误的行数并保存日志文件

    Android日志打印类LogUtils,能够定位到类名,方法名以及出现错误的行数并保存日志文件 在开发中,我们常常用打印log的方式来调试我们的应用.在Java中我们常常使用方法System.out ...

  6. 严重性 代码 说明 项目 文件 行 禁止显示状态错误 C1128 节数超过对象文件格式限制: 请使用 /bigobj 进行编译。

    严重性 代码 说明 项目 文件 行 禁止显示状态错误 C1128 节数超过对象文件格式限制: 请使用 /bigobj 进行编译. 默认情况下,对象文件最多可存放 65,536 (2^16) 个可寻址的 ...

  7. Delphi Windows API判断文件共享锁定状态(OpenFile和CreateFile两种方法)

    一.概述 锁是操作系统为实现数据共享而提供的一种安全机制,它使得不同的应用程序,不同的计算机之间可以安全有效地共享和交换数据.要保证安全有效地操作共享数据,必须在相应的操作前判断锁的类型,然后才能确定 ...

  8. Delphi Windows API判断文件共享锁定状态(使用OpenFile来判断)

    一.概述 锁是操作系统为实现数据共享而提供的一种安全机制,它使得不同的应用程序,不同的计算机之间可以安全有效地共享和交换数据.要保证安全有效地操作共享数据,必须在相应的操作前判断锁的类型,然后才能确定 ...

  9. C# 如何获取错误所在行数

    两种方法,一种是利用error.StackTrace,另外一种是try-catch找到错误行数,具体如下: 一.error.StackTrace代码 int i = ex.StackTrace.Ind ...

随机推荐

  1. poj 2425 A Chess Game_sg函数

    题意:给你一个有向无环图,再给你图上的棋子,每人每次只能移动一个棋子,当轮到你不能移动棋子是就输了,棋子可以同时在一个点 比赛时就差这题没ak,做了几天博弈终于搞懂了. #include <io ...

  2. VRay 2.0 SP1 2.10.01 for 3ds max 9/2008/2009/2010/2011/2012 32/64位 顶渲简体中文版+英文版[中国室内设计论坛-室内人]

    VRay 2.0 SP1 2.10.01 for 3ds max 9/2008/2009/2010/2011/2012 32/64位 顶渲简体中文版+英文版[中国室内设计论坛-室内人] 对最新版本的V ...

  3. GCC 编译选项

    http://www.cnblogs.com/xmphoenix/archive/2011/03/21/1989944.html GCC 编译选项(转) gcc提供了大量的警告选项,对代码中可能存在的 ...

  4. eclipse sysout快捷输入启用

    Window-Preference-java-editor-content assist-advanced 一定要勾选Template Propasals. 关于Template Propasals: ...

  5. 菜鸟必须知道的linux的文件目录结构

    Linux文件目录结 / 根目录,所有的目录.文件.设备都在/之下,/就是Linux文件系统的组织者,也是最上级的领导者. /bin bin就是二进制(binary)英文缩写.在一般的系统当中,你都可 ...

  6. Android 基本控件

    http://www.cnblogs.com/LT-blogs/archive/2012/08/07/2626118.html http://blog.csdn.net/android_tutor/a ...

  7. ORACLE告警日志

    告警日志介绍 告警日志文件是一类特殊的跟踪文件(trace file).告警日志文件命名一般为alert_<SID>.log,其中SID为ORACLE数据库实例名称.数据库告警日志是按时间 ...

  8. 【最小费用最大流模板】【Uva10806+Spring Team PK】Dijkstra, Dijkstra,

    题意:从1到n 再从n到1 不经过重复的边 ,(如果是点就是旅行商问题了),问最短路 建立一个超级源S S到1连一条费用为0,容量为2的边,求费用流即可 如果流<2 那么hehe 否则    输 ...

  9. H264标准句法表中C的含义理解

    下面一段是H264官方中文版中给出的解释: “类别(在表中以C 表示)规定条带数据可以至多划分为三种条带数据类别.条带数据类别A 包含了类别2的所有语法元素.条带数据类别B 包含了类别3 的所有语法元 ...

  10. Tomcat启动报ClassNotFoundException错误,解决

    今天把一个Maven管理的web项目Update后,启动Tomcat(Eclipse中)系统报错.错误提示 java.lang.ClassNotFoundException: ,显示是spring的C ...