您的位置:首页 > 数据库

Acess错误:"文件共享锁定数溢出"

2012-09-02 09:32 169 查看
     对于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
   将MaxLocksPerFile默认的十进制值9500改大即可。呵呵,我改成了十进制的99999999

    这里需要注意的地方是这位置是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;

            }
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐