CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  Web 开发 >  ASP

ASP ACCESS ADO 内存溢出

楼主9894163(1412)2004-08-01 12:27:45 在 Web 开发 / ASP 提问

这个问题有一票人问,一票人乱回答,我实在看不下去了……  
   
  当ACCESS的表中有多国东方语言时(比如中文和日文)  
   
  进行   Like   查询到日文时就会产生   内存溢出错误  
   
  此问题已经由MS工程师确认为   Access   的   Bug   (SQL   Server   无此问题)  
   
  建议的解决方法为  
  1   使用外部内部独立编码  
  2   ……忘了  
   
  谁能提供比较现实的方法或者代码解决? 问题点数:0、回复次数:6Top

1 楼3KBsoft(三块半)回复于 2004-10-30 05:58:38 得分 0

==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  
  ===========================================  
  Blueidea.com   web   team   member   V37(PaintBlue.Net)Top

2 楼yb2008(中科商务网--ZKE360.COM)回复于 2004-10-30 08:11:41 得分 0

帮顶!Top

3 楼tpf9000(流光鸟)回复于 2004-10-30 08:50:19 得分 0

好文章,顶Top

4 楼ccm1980(海浪)回复于 2004-10-30 08:53:47 得分 0

经典,学习Top

5 楼eyun(艺云)回复于 2005-03-21 14:59:28 得分 0

http://access911.net/71FAB11E12DCE9F3.htmTop

6 楼bluemoon0001(小天--追梦浪子)回复于 2005-03-21 15:07:50 得分 0

你可能用的是access,并且库中存的是"繁体"、“日文”或“韩文”  
  用SQl   Server库就行了。Top

相关问题

  • 内存溢出
  • 内存溢出
  • MemoryStrea使内存溢出?
  • 为什么内存溢出??
  • “内存溢出”问题!
  • VB提示内存溢出
  • 内存溢出。求助!
  • asp+access:like检索出错:Microsoft JET Database Engine (0x80040E14) 内存溢出,据说是日文字符造成的???
  • ●●●关于asp中数据内存溢出错误??,绝对有难度,怪!!在线等啊.....
  • ASP 椎栈溢出

关键词

  • .net
  • 内存
  • 字段
  • 字符
  • access
  • 解决
  • sql
  • 日文
  • 内存溢出
  • 搜索

得分解答快速导航

  • 帖主:9894163

相关链接

  • Web开发类图书

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo