搜索ACCESS数据库遇日文时内存溢出的处理办法:

ACCESS有个BUG,那就是在使用 like 搜索时如果遇到日文就会出现“内存溢出”的问题,提示“80040e14/内存溢出”。

那导致出问题的26个日文:ゴ ガ ギ グ ゲ ザ ジ ズ ヅ デ ド ポ ベ プ ビ パ ヴ ボ ペ ブ ピ バ ヂ ダ ゾ ゼ

说一下解决办法:

1、最笨的方法:删除含有日文的数据

这就不用解释了,现在的都是些重要的资料不可能删除的,这个方法pass掉。

2、替换方法:

思路:就是存储进入数据库时把那26个日文替换成别的编码,在从数据库取出来后在反替换回来;
同1,库里的数据都是制作好的,不能随便更改的,这个方法pass掉。下边的函数还是vb搞的,还需要改成C#的多麻烦呀。

从网上找了个现成的函数:
编码:
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

3、处理SQL语句:
还是这个方法简单点
不要使用like语句,举个例子:
会出问题的SQL:  where title like ‘%”&keyword&”%’

现在换成下面的就不会出现内存溢出了:where InStr(1,LCase(Title),LCase(‘”&keyword&”‘),0)<>0

问题应该可以解决了。呵呵。
如 果要not like的话这样写:(InStr(1, LCase(Title), LCase(‘”&keyword&”‘), 0) = 0 or InStr(1, LCase(Title), LCase(‘”&keyword&”‘), 0) is Null)

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)

当字段内包含了这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’