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;
}
"文件共享锁定数溢出"
原因如下:
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;
}
相关文章推荐
- Acess错误:"文件共享锁定数溢出"
- Acess错误:"文件共享锁定数溢出"
- Acess错误:"文件共享锁定数溢出"
- 64位Win7下Access提示”文件共享锁定数溢出“
- VirtualBox的Ubuntu中文件共享问题的解决:未处理的错误消息,获取文件"/media/sf_***"信息出错,协议错误
- “文件共享锁定数溢出” 原因及解决方法
- VMWare虚拟机提示:"锁定文件失败,打不开磁盘"或“内部错误”的解决办法
- mono 3.4.0 make install的时候出现"找不到 Microsoft.Portable.Common.targets 文件”的错误提示解决方法
- Blend "无法启动”http://localhost:xxxx/Default.html“出现以下错误System.ComponentModel.Win32Exception(0x80004005):系统找不到指定文件
- require "watir"报装载库文件错误(no such file to load -- watir)
- error LNK2019: 无法解析的外部符号 ***,该符号在函数 "***"中被引用 || 错误:无法打开导入的***.lib 文件
- IIS已经存在文件,提示"HTTP 错误 404 - 找不到文件或目录
- 写mp4文件,无法用quicktime播放,提示"public movie atom"错误
- VMware显示错误:“未能锁定文件 无法打开磁盘 ..\*.vmdk 或者某一个快照所依赖的磁盘。”解决办法
- proto-lua-gen 转换proto文件错误 Expected top-level statement <e.g ."message">.
- ibatis中配置文件载入错误org.xml.sax.SAXParseException: The string "--" is not permitted
- 解决SqlServer "设备激活错误,请使用 WITH MOVE 选项来标识该文件的有效位置"
- SQL 无法打开物理文件 XXX.mdf",操作系统错误 5:"5(拒绝访问。)"
- 虚拟机无法打开磁盘 "或者某一个快照所依赖的磁盘 原因:未能锁定文件"的解决办法
- 解决win7访问xp共享的文件时,未知用户名或者密码错误的问题