编了三年的ASP程序,前些天却碰到了一个这样的问题,向各位高手求解!

icarian_guy 2006-02-16 03:53:22
在查询时出错提示:
Microsoft JET Database Engine 错误 '80040e14'

内存溢出

/card/user_search_info.asp,行 90
这个程序使用得是ACCESS数据库,数据量比较得大了,大概10000多条记录吧,
各位请帮助解决,多谢
...全文
490 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
lightenvoy 2006-02-21
  • 打赏
  • 举报
回复
楼竹,代码精简下先,然后输出SQL给我们看看~
优化你的代码~
bzscs 2006-02-20
  • 打赏
  • 举报
回复
遇到过,日文,造成内存溢出
soft_2008 2006-02-20
  • 打赏
  • 举报
回复
这个问题据说是Access的一个BUG,在SQL Server没有发现这个问题。原因绝大多数的情况是由于文章、标题、名字等内容的标题、名称或者关键字等字段内含有一些日本片假名造成的。这些非法字符包括:(不能写出来,否则搜索该出错了)。
本来我是想替换的方式来解决的,不过太麻烦了,几万条信息,我哪里知道那条信息有这个问题啊。后来还是找到了一个方法,程序如下:

<%
'检查有日文片假名的新闻

Server.ScriptTimeout=1200
dim conn,str,rs, sql
set conn=server.createobject("adodb.connection")
set rs=server.createobject("adodb.recordset")
str="provider=Microsoft.Jet.OLEDB.4.0; Data Source="+Server.MapPath("database/medizone_77990.asa")
conn.open str
sql="select ArticleID from Article"

rs.open sql,conn,1,1
on error resume next
do until rs.eof
sql="select ArticleID from Article where (content like 'a') and ArticleID= "& rs("ArticleID")
Err=0
conn.execute(sql)
if not Err=0 then
Response.Write "错误新闻ID:"
Response.Write rs("ArticleID")
Response.Write "<br>"
Err=0
'sql = "delete * from news where newsid ="& rs("newsid")
'conn.execute(sql)
end if
rs.movenext
loop

rs.close
conn.close
response.write "查找完成"
%>
这样你就可以查找出来到底那条信息含有日文片假名,删除那些文字即可。

不知MS发布补丁没有-_-#@
icarian_guy 2006-02-20
  • 打赏
  • 举报
回复
问题还是出现,实在没哲了,
lisoon 2006-02-20
  • 打赏
  • 举报
回复
不只日文会出错,有些繁体字也会出错,还有一些欧洲国家的,刚开始我也被他们搞疯。
Hellohuan 2006-02-20
  • 打赏
  • 举报
回复
+up +jf

--------------------
我用ASP写的技术社区:
http://udclub.com/cn/community/default.html
李睿_Lee 2006-02-19
  • 打赏
  • 举报
回复
好像楼上有答案了。
UP
soft_2008 2006-02-19
  • 打赏
  • 举报
回复
mark..........
icarian_guy 2006-02-19
  • 打赏
  • 举报
回复
各位兄弟,多谢了,刚发了帖,出差了几天,想不到这么多朋友回应,实在抱歉呀.问题我可以肯定不是出在程序上面,这是这条语句:
sql="select * from corpcard where 1=1 "
'response.write("DDDdd")
'if request.form("corporation")<>"" then
sql=sql&"and corporation like'%"&request.form("corporation")&"%'"

'end if
if request.form("tel")<>"" then
sql=sql&"and tel like'%"&request.form("tel")&"%'"
end if
if request.form("address")<>"" then
sql=sql&"and address like'%"&request.form("address2")&"%'"
end if
if request.form("pname")<>"" then
sql=sql&"and pname like'%"&request.form("pname")&"%'"
end if
if request.Form("moble")<>"" then
sql=sql&"and moble like'%"&request.form("moble")&"%'"
end if
if request.Form("fax")<>"" then
sql=sql&"and fax like'%"&request.form("fax")&"%'"
end if

if trim(request.Form("pingsort"))<>"请选择" then
sql=sql&"and pingsort like'%"&request.form("pingsort")&"%'"
end if


if request.form("province")<>35 then '35是请选择的编号
sql=sql& " and shengname ='"&request.form("province")&"'"
sql=sql& " and shiname ='"&request.form("city")&"'"
end if
'-----------------查询出错地方(下面)-----------------
if request.Form("pingname")<>"" then
sql=sql&" and pingname like'%"&request.form("pingname")&"%'"

end if
'-----------------查询出错地方(上面)-----------------
sql=sql&" order by cost desc"
超级大笨狼 2006-02-17
  • 打赏
  • 举报
回复
http://www.aspfaq.com/show.asp?id=2400
尚和空四 2006-02-17
  • 打赏
  • 举报
回复
机器处理问题
德仔 2006-02-17
  • 打赏
  • 举报
回复
==26个日文片假名导致Access搜索(80040e14/内存溢出)的解决办法==

ゴ ガ ギ グ ゲ ザ ジ ズ ヅ デ ド ポ ベ プ ビ パ ヴ ボ ペ ブ ピ バ ヂ ダ ゾ ゼ
当字段内包含了这26个日文字符任意一个多个时,就会导致在执行SQL语句中包含了
[字段] like '%aaaaa%' 或 inStr(1,[字段],'aaaaa',1)>0
这样的查询时,毫无道理的出现了
"Microsoft JET Database Engine 错误 '80040e14' 内存溢出"的错误
其他Jet SQL函数命令未作测试,大概与字符搜索定位匹配相关的都可能出错

搜索相关资料得知被微软工程师证实是Access的bug,可能是语法关系都是微软的东东
在vbs中 执行inStr(1,日文平假名变量,"aaaaa",1)依然要出现错误
Microsoft VBScript 运行时错误 错误 '800a0005' 无效的过程调用或参数: 'instr'


没有搜索,因这几个字符出现Access的论坛网站搜索无法进行,何等痛苦
昨天一朋友大叫怪事,他的音乐数据库无法搜索了,只有30000条记录时是好的
毫无疑问,日文片假名是祸根,花几分钟把有包含上面的日文替换成"?"搜索顺利恢复
找来论坛程序用户群最大的动网dvBBS AC版本 7.0SP2 版测试,同样有这个日文发帖后 导致无法搜索并且运行时出错的问题
线上去搜索 '80040e14' 内存溢出" 的错误 多的是!

一简单有效的解决办法:
对这26个字符进行编码和解码,可能效率感觉不理想,测试下来问题不大,速度影响不是太大

编码:

Function Jencode(byVal iStr)
if isnull(iStr) or isEmpty(iStr) then
Jencode=""
Exit function
end if
dim F,i,E
' F=array("ゴ","ガ","ギ","グ","ゲ","ザ","ジ","ズ","ヅ","デ",_
' "ド","ポ","ベ","プ","ビ","パ","ヴ","ボ","ペ","ブ","ピ","バ",_
' "ヂ","ダ","ゾ","ゼ")
E=array("Jn0;","Jn1;","Jn2;","Jn3;","Jn4;","Jn5;","Jn6;","Jn7;","Jn8;","Jn9;","Jn10;","Jn11;","Jn12;","Jn13;","Jn14;","Jn15;","Jn16;","Jn17;","Jn18;","Jn19;","Jn20;","Jn21;","Jn22;","Jn23;","Jn24;","Jn25;")
F=array(chr(-23116),chr(-23124),chr(-23122),chr(-23120),_
chr(-23118),chr(-23114),chr(-23112),chr(-23110),_
chr(-23099),chr(-23097),chr(-23095),chr(-23075),_
chr(-23079),chr(-23081),chr(-23085),chr(-23087),_
chr(-23052),chr(-23076),chr(-23078),chr(-23082),_
chr(-23084),chr(-23088),chr(-23102),chr(-23104),_
chr(-23106),chr(-23108))
Jencode=iStr
for i=0 to 25
Jencode=replace(Jencode,F(i),E(i))
next
End Function

解码:

Function Juncode(byVal iStr)
if isnull(iStr) or isEmpty(iStr) then
Juncode=""
Exit function
end if
dim F,i,E
' F=array("ゴ","ガ","ギ","グ","ゲ","ザ","ジ","ズ","ヅ","デ",_
' "ド","ポ","ベ","プ","ビ","パ","ヴ","ボ","ペ","ブ","ピ","バ",_
' "ヂ","ダ","ゾ","ゼ")
E=array("Jn0;","Jn1;","Jn2;","Jn3;","Jn4;","Jn5;","Jn6;","Jn7;","Jn8;","Jn9;","Jn10;","Jn11;","Jn12;","Jn13;","Jn14;","Jn15;","Jn16;","Jn17;","Jn18;","Jn19;","Jn20;","Jn21;","Jn22;","Jn23;","Jn24;","Jn25;")
F=array(chr(-23116),chr(-23124),chr(-23122),chr(-23120),_
chr(-23118),chr(-23114),chr(-23112),chr(-23110),_
chr(-23099),chr(-23097),chr(-23095),chr(-23075),_
chr(-23079),chr(-23081),chr(-23085),chr(-23087),_
chr(-23052),chr(-23076),chr(-23078),chr(-23082),_
chr(-23084),chr(-23088),chr(-23102),chr(-23104),_
chr(-23106),chr(-23108))
Juncode=iStr
for i=0 to 25
Juncode=replace(Juncode,E(i),F(i))'□
next
End Function

注意,如果直接使用字符不方便(windows还没装日文支持),注释掉的部分提供有 chr(-23804) ..这样的定义

这样
1.
表单输入保存时,使用Jencode()将这26个字符先编码再保存(为什么是这26个字符,经过全部测试87个平假名89个片假名最终认定的)

ゴ 即 chr(-23116) 编码为 Jn1;
2.
显示时,则使用 Juncode() 函数进行解码,还原日文片假名显示
3.
搜索关键字,也要使用 Jencode() 进行编码后再放入 like里
where [Topic] like '%Jencode(kewwords)%' 使用
才能保证搜索的值和编码过的数据库字段内容匹配

==================================

PS:
也可以使用正则表达式来改写上面的两个函数,或许效率还要更高些
再就是如果 压根不使用日文,也不需要搜索日文,则解码部分可以不用,保存数据实直接把这26个片假名字符替换为空字符或任一字符,比如"□"
抛砖引玉,如果有更本质的真正的好方法,谢分享

附:
----------------------------
平假名87个 asc值
-23391 --> -23316
unicode 3040-309F

ぁあぃいぅうぇえぉお
かがきぎくぐけげこご
さざしじすずせぜそぞ
ただちぢっつづてでと
どなにぬねのはばぱひ
びぴふぶぷへべぺほぼ
ぽまみむめもゃやゅゆ
ょよらりるれろゎわゐ
ゑをん゛゜ゝゞ
------------------------------
片假名89个 asc值
-23135 -> -23059
unicode 30A0-30FF

ァアィイゥウェエォオ
カガキギクグケゲコゴ
サザシジスズセゼソゾ
タダチヂッツヅテデト
ドナニヌネノハバパヒ
ビピフブプヘベペホボ
ポマミムメモャヤュユ
ョヨラリルレロヮワヰ
ヱヲンヴヵヶーヽヾ
================补充 修改的版本===========================

添加一个编码解码参数codeType
都使用一个函数
使用chr()不直接使用日文字符
这样~ 够简洁了吧?

疑点: 显示日文是不会出错的,保存到数据库也不会出错
只有SQL使用 like 和 inStr 的时候 才会出错 这个与显示无关!
还有在vbs里使用 inStr(1,str,"aaa",1)这样按字符搜索也会错
改为 inStr(lcase(str),"aaa") 就不会出错

如果一定得用 inStr(1,str,"aaa",1) 字符搜索语法
则一定要在先inStr() 后 jncode() 的顺序 否则会出错

一点问题都没有! 注意到这几点绝对没错!

rs("TopicStr")=Jncode(TopicStr,true) 'encode 保存到数据库的资料
DisplayStr=Jncode(rs("TopicStr"),false) 'uncode '显示到页面的标题

Function Jncode(byVal iStr,codeType)
if isnull(iStr) or isEmpty(iStr) or iStr="" then
Jncode=""
Exit function
end if
dim F,i,E
E=array("Jn0;","Jn1;","Jn2;","Jn3;","Jn4;","Jn5;","Jn6;",_
"Jn7;","Jn8;","Jn9;","Jn10;","Jn11;","Jn12;","Jn13;",_
"Jn14;","Jn15;","Jn16;","Jn17;","Jn18;","Jn19;","Jn20;",_
"Jn21;","Jn22;","Jn23;","Jn24;","Jn25;")
F=array(chr(-23116),chr(-23124),chr(-23122),chr(-23120),_
chr(-23118),chr(-23114),chr(-23112),chr(-23110),_
chr(-23099),chr(-23097),chr(-23095),chr(-23075),_
chr(-23079),chr(-23081),chr(-23085),chr(-23087),_
chr(-23052),chr(-23076),chr(-23078),chr(-23082),_
chr(-23084),chr(-23088),chr(-23102),chr(-23104),_
chr(-23106),chr(-23108))
if codyType then
for i=0 to 25
iStr=replace(iStr,F(i),E(i))'□
next
else
for i=0 to 25
iStr=replace(iStr,E(i),F(i))'□
next
end if
Jncode=iStr
End Function

================补充 修改的版本2 改用unicode===========================

添加一个编码解码参数codeType
都使用一个函数
使用chr()不直接使用日文字符
这样~ 够简洁了吧?

疑点: 显示日文是不会出错的,保存到数据库也不会出错
只有SQL使用 like 和 inStr 的时候 才会出错 这个与显示无关!
还有在vbs里使用 inStr(1,str,"aaa",1)这样按字符搜索也会错
改为 inStr(lcase(str),"aaa") 就不会出错

如果一定得用 inStr(1,str,"aaa",1) 字符搜索语法
则一定要在先inStr() 后 jncode() 的顺序 否则会出错

一点问题都没有! 注意到这几点绝对没错!

rs("TopicStr")=Jncode(TopicStr,true) 'encode 保存到数据库的资料
DisplayStr=Jncode(rs("TopicStr"),false) 'uncode '显示到页面的标题

Function Jncode(byVal iStr,codeType)
if isnull(iStr) or isEmpty(iStr) or iStr="" then
Jncode="" : Exit function
end if
dim F,i,E
E=array("Jn0;","Jn1;","Jn2;","Jn3;","Jn4;","Jn5;","Jn6;",_
"Jn7;","Jn8;","Jn9;","Jn10;","Jn11;","Jn12;","Jn13;",_
"Jn14;","Jn15;","Jn16;","Jn17;","Jn18;","Jn19;","Jn20;",_
"Jn21;","Jn22;","Jn23;","Jn24;","Jn25;")
F=array(chrw(12468),chrw(12460),chrw(12462),chrw(12464),_
chrw(12466),chrw(12470),chrw(12472),chrw(12474),_
chrw(12485),chrw(12487),chrw(12489),chrw(12509),_
chrw(12505),chrw(12503),chrw(12499),chrw(12497),_
chrw(12532),chrw(12508),chrw(12506),chrw(12502),_
chrw(12500),chrw(12496),chrw(12482),chrw(12480),_
chrw(12478),chrw(12476))
if codyType then
for i=0 to 25 iStr=replace(iStr,F(i),E(i)) next
else
for i=0 to 25 iStr=replace(iStr,E(i),F(i)) next
end if
Jncode=iStr
End Function


===========================================
Blueidea.com web team member V37(PaintBlue.Net) / 转贴注明出处


http://www.blueidea.com/bbs/NewsDetail.asp?id=1768538
lightenvoy 2006-02-17
  • 打赏
  • 举报
回复
BS楼猪,淹死他,没说一句话
bingdian37 2006-02-17
  • 打赏
  • 举报
回复
说详细一点,大家讨论起来也方便啊
jspadmin 2006-02-17
  • 打赏
  • 举报
回复
数据量太大是一种可能,不过,更可能是你程序的问题
caobin518 2006-02-16
  • 打赏
  • 举报
回复
另外记得压缩数据库
eoasis 2006-02-16
  • 打赏
  • 举报
回复
照常理来说10000多条数据应该不会出现这种情况,看看还有没有其它可能
hj3793 2006-02-16
  • 打赏
  • 举报
回复
数据量多了,不要用 Select * from ,用 Select Top N 字段一,字段二...查询
ybfqlyq 2006-02-16
  • 打赏
  • 举报
回复
看一下是不是有日文的字符??
http://www.ybfq.net/article/show.asp?id=1492
rimguncheng 2006-02-16
  • 打赏
  • 举报
回复
数据量比较得大
用的是access 是不是数据库不行了啊
加载更多回复(4)

28,406

社区成员

发帖
与我相关
我的任务
社区描述
ASP即Active Server Pages,是Microsoft公司开发的服务器端脚本环境。
社区管理员
  • ASP
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧