注册 登录
编程论坛 VB6论坛

查询ACCESS内存溢出

linandceline 发布于 2015-04-11 17:01, 1347 次点击
我的目的是通过TEXT的变化自动筛选ACCESS中符合条件的数据并列到LIST中
当数据库中数据较少时没有问题,数据较多时出现内存溢出,真实使用数据约9K行
代码如下,求教解决办法

Private Sub Text2_Change()
Dim m As String
m = Text2.Text
List1.Clear
Text1.Text = ""

Set Conn = CreateObject("ADODB.Connection")
Connstr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & App.Path & "\技术文件信息.mdb"
Conn.Open Connstr
Set Rs = CreateObject("adodb.recordset")
SQL = "Select * From SFILE where 文件代码 like  '%" & m & "%' or 物料编码 like  '%" & m & "%' or 文件名称 like  '%" & m & "%'"
Rs.Open SQL, Conn, 1, 2

Do While Not Rs.EOF
  List1.AddItem Rs("文件代码").Value & "  " & Rs("物料编码").Value & "  " & Rs("文件名称").Value
  Rs.movenext
Loop

End Sub
16 回复
#2
xzlxzlxzl2015-04-11 18:32
好像listbox控件最大行数限制为32767
#3
renxiaoyao362015-04-12 18:53
不清楚最大限制,但是是个变量就肯定有限制。所以楼上有道理
#4
风吹过b2015-04-13 09:38
可以使用 翻页技术,不需要一次性把数据全部加载到 控件里。

你可以计算一下当前能显示的行数,然后以这个行数去做翻页功能。同时提供 向后跳转多页的功能。
翻页功能,在 ASP 里代码使用的非常多,可以参考一下那边的代码。
代码很类似,可以只看 <%  %> 的部分,外面是HTML用的,属于原样输出。
#5
linandceline2015-04-13 10:53
回复 2楼 xzlxzlxzl
我主要想知道问题是出在哪里,怎么去解决
如果是限制是你所提的那个数值,那我的实际数值还远远达不到,这又是怎么回事呢?
#6
linandceline2015-04-13 14:14
回复 4楼 风吹过b
我现在是用了ON ERROR来规避
这样导出来的程序会有什么问题么?
#7
风吹过b2015-04-13 16:27
我现在是用了ON ERROR来规避

这个一般用来是处理 未想到的错误,更容易导致程序不可控。

---------------------------------
大数据量时,都是不建议一次性装入控件。主要原因有:
1、占用内存
2、数据类型超限
3、运算过程漫长

特别是UI需要运算结果时,那这个运算过程漫长更是一个致命的问题。
-------------------------
VB6 是基于类的面向对象的编程语言,所提供的控件,窗体都是一个一个的类。
类里保存大量数据时,需要反复执行类里的相应的函数,而这个数据保存在内存,有二种方式,一种是重新申请内存,复制内存,一种是链表。
VB6可以是使用下标随机访问,所以我猜测可能是使用重新分配内存。在这过程中需要重复大量的申请内存,复制内存操作。
在这过程中,完全有可能因为内存碎片造成无法分配足够大的内存时而造成内存溢出。
=========================
有二种解决办法。
一是 只装入所需的数据,实行分页。
二是 使用自定义方式显示数据,这种情况我们可以直接使用数据库来源进行操作,而不需要再缓存。
#8
linandceline2015-04-13 17:39
回复 7楼 风吹过b
用了ON ERROR后,查询没出现问题
我之前试过好多次,基本可以判定是在没有符合查询条件的情况时,内存就溢出
#9
lianyicq2015-04-14 10:46
回复 楼主 linandceline
如果定义long型变量,listbox行数超过32k,每行近百个字符也测试过,也没问题。
textbox变化产生查询的时候,实际上从text2输入的只有一个字符,一个字符赋值给m?如果数据9k行,这么多字段,不会只有一位字符表示吧。
...
#10
风吹过b2015-04-14 12:20
如果定义long型变量,listbox行数超过32k,每行近百个字符也测试过,也没问题。


经测试,listbox.listconst 类型是 Integer ,但这仅仅是输出来的类型,在内部应该还是 LONG 类型。没有报错,还可以继续添加。
测试代码:WIN7(X86)+VB6
Private Sub Command1_Click()
Dim i As Long
Dim j As Integer
For i = 1 To 10240              '一次写入10K行
    List1.AddItem i
Next i

Label1.Caption = List1.ListCount    '写完后显示总行数
Debug.Print List1.ListCount

End Sub

测试结果
 10240
 20480
 30720
-24576
-14336
-4096
 6144

明显看到第四个数字就是溢出到符号位了,而第7个数字时,更是溢出了整数范围,明显超出了 2字节 的范围了。

======================
竟然listbox控件支持long行,那就说明问题不应该出在:
Do While Not Rs.EOF
  List1.AddItem Rs("文件代码").Value & "  " & Rs("物料编码").Value & "  " & Rs("文件名称").Value
  Rs.movenext
Loop
这个部分,那就需要去检查
SQL = "Select * From SFILE where 文件代码 like  '%" & m & "%' or 物料编码 like  '%" & m & "%' or 文件名称 like  '%" & m & "%'"
Rs.Open SQL, Conn, 1, 2
这个部分了。
没有数据库,无从测试。

-----------------------
建议楼主,明确告诉内存溢出错误在那一行。或者测试一下查询时是否有内存溢出情况。

这靠这静态代码,没有数据库,不去做动态测试,无从排错。

----------------
JET 或 ACCESS 的限制,百度没找着。
#11
linandceline2015-04-16 11:53
不好意思,这两天忙了些,没上来。
先感谢各位,先结贴再回复了

回复 风吹过b
    我又在精简版上运行,删掉了ON ERROR,查询又没问题,实在摸不懂了
    之前是运行的企业版报错,显示是这行Rs.movenext

回复 lianyicq
    m = Text2.Text,这不是重新赋值吗
#12
linandceline2015-04-16 11:56
只是现在又出现了一个问题。
我把生成的EXE拿到同事那测试,结果一运行就什么都没显示了,但是进程里边可以看到
怎么解决呀
#13
wmf20142015-04-16 12:15
回复 12楼 linandceline
一般是使用的控件没注册造成的,在vb的环境下打包,然后在朋友机器上安装试下。
#14
linandceline2015-04-16 13:53
回复 13楼 wmf2014
我是生成执行文件后到同事那试的,还要在别的机器注册吗

[ 本帖最后由 linandceline 于 2015-4-16 14:00 编辑 ]
#15
风吹过b2015-04-16 15:11
Rs.movenext 报内存溢出,
那就是 系统空闲内存紧张,程序申请内存时出现错误。

刚百度搜索了一下,错误有原因有:
引起内存溢出的原因有很多种,常见的有以下几种:
 内存中加载的数据量过于庞大,如一次从数据库取出过多数据;
#16
linandceline2015-04-16 16:41
回复 13楼 wmf2014
现在麻烦了,同事没有本地硬盘的权限。
就算要在他们机器上注册也不行了。
有没有将部件转为模块的方法?
#17
linandceline2015-04-16 16:43
回复 15楼 风吹过b
内部用的小程序,不行我还是先用ON ERROR吧,后面再改进它
1