织梦CMS - 轻松建站从此开始!

罗索实验室

当前位置: 主页 > 基础技术 > 数据库开发 >

Access:ODBC 驱动程序不支持所需的属性的解决办法

罗索客 发布于 2009-07-17 10:21 点击:次 
我的在火山的网站在对Access数据库进行模糊查询的时候总是会报:-2147217887:ODBC 驱动程序不支持所需的属性。后来把它移动了门户通,结果门户通的主机就没这个问题,实在搞不清楚原因。
TAG:

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),_ [FS:PAGE] 
           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  
   
   ァアィイゥウェエォオ  
   カガキギクグケゲコゴ  
   サザシジスズセゼソゾ  
   タダチヂッツヅテデト  
   ドナニヌネノハバパヒ  
   ビピフブプヘベペホボ  
   ポマミムメモャヤュユ  
   ョヨラリルレロヮワヰ  
   ヱヲンヴヵヶーヽヾ


   ACCESS数据库含有某些特定日文字符时,like检索可能会出错的几种情况:   
    
   连接方式与打开方式  
   ========================  
   conn.open    "driver={microsoft    access    driver    (*.mdb)};dbq="    &    DatabaseToQuery  
   rs_str.open    StrSQL,conn,1,1  
   出错  
   ========================  
   错误描述:    ODBC    驱动程序不支持所需的属性。  
   错误编号:    -2147217887  
   错误类型:  
   Microsoft    OLE    DB    Provider    for    ODBC    Drivers    (0x80040E21)  
   /syl/access-syl-str.asp,    第    442    行   



   连接方式与打开方式  
   ========================  
   conn.open    "driver={microsoft    access    driver    (*.mdb)};dbq="    &    DatabaseToQuery  
   rs_str.open    StrSQL,conn,1,3  
   出错  
   ========================  
   错误描述:    [Microsoft][ODBC    Microsoft    Access    Driver]    内存溢出  
   错误编号:    -2147217913  
   错误类型:  
   Microsoft    OLE    DB    Provider    for    ODBC    Drivers    (0x80040E07)   



   连接方式与打开方式  
   ========================  
   conn.open    "Provider=Microsoft.Jet.OLEDB.4.0;    Data    Source="    &    DatabaseToQuery  
   rs_str.open    StrSQL,conn,1,1  
   出错  
   ========================  
   错误描述:    内存溢出  
   错误编号:    -2147217900  
   错误类型:  
   Microsoft    JET    Database    Engine    (0x80040E14)   



   连接方式与打开方式  
   ========================  
   conn.open    "Provider=Microsoft.Jet.OLEDB.4.0;    Data    Source="    &    DatabaseToQuery  
   rs_str.open    StrSQL,conn,1,3  
   出错  
   ========================  
   错误描述:    内存溢出  
   错误编号:    -2147217900  
   错误类型:  
   Microsoft    JET    Database    Engine    (0x80040E14)   


   解决办法就是按照kkkbs(邂逅浪漫)的办法去除日文字符。

(佚名)
本站文章除注明转载外,均为本站原创或编译欢迎任何形式的转载,但请务必注明出处,尊重他人劳动,同学习共成长。转载请注明:文章转载自:罗索实验室 [http://www1.rosoo.net/a/200907/7360.html]
本文出处:网络博客 作者:佚名
顶一下
(1)
25%
踩一下
(3)
75%
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 验证码:点击我更换图片
栏目列表
将本文分享到微信
织梦二维码生成器
推荐内容