设为首页收藏本站Access中国

Office中国论坛/Access中国论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

返回列表 发新帖
查看: 2261|回复: 7
打印 上一主题 下一主题

[模块/函数] 求助!用ADO流(Stream)写入大二进制文件出错

[复制链接]
跳转到指定楼层
1#
发表于 2010-5-17 11:41:58 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
用ADO Stream 写入的二进制文件如果大于150M那么就会出现

  “内存不足”的错误

我看过红尘版主的“上传与下载”文件,也是用ADO流的方式写入二进制文件到OLE字段,如果文件大于100M以上,那么也会出现内存不足的错误。

不知道那位大侠有良好的解决方法
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享分享 分享淘帖 订阅订阅
2#
发表于 2010-5-17 13:27:15 | 只看该作者
将文件分块写入到数据库的ole字段。
3#
 楼主| 发表于 2010-5-17 15:00:26 | 只看该作者
首先谢谢你的回答
我也试过用分块写,
写进去后,导出来就比较麻烦啊
4#
发表于 2010-5-17 15:03:50 | 只看该作者
首先谢谢你的回答
我也试过用分块写,
写进去后,导出来就比较麻烦啊
sxb2007 发表于 2010-5-17 15:00


分块导出。
5#
 楼主| 发表于 2010-5-17 15:23:25 | 只看该作者
能不能提示一下啊,我写得进去,
导出不来,不知道怎么把文件叠加起来啊
如有100M的文件,我分为10条记录,每条记录存入10M到表的OLE字段上,
但导出来就不会弄了,弄了很久都没有弄出来.
谢谢你,不能不给我讲讲,怎么叠加流啊
6#
发表于 2010-5-18 09:36:33 | 只看该作者
呵呵,不是分为10条记录,而是分10块保存到同一条记录里。等会写个代码给你。
7#
发表于 2010-5-18 10:21:54 | 只看该作者
本帖最后由 sgrshh29 于 2010-5-20 10:42 编辑

5# sxb2007


写了比较详细的注释,ado部分就不写注释了。不要忘记引用ado!
先设计一个表,名称为tbl,二个字段:ID为自动编号主键,fole为ole用来储存二进制数据
再设计一个窗体名称为窗体1,添加一个文本框名称为text0,用来显示记录的ID、一个导入按钮,一个导出按钮。窗体代码自己根据需要写。

下面是导入导出模块

导入模块
Sub FileToOle(strFileName As String)    ‘strFileName为将要保存到数据库的完整文件名
If strFileName = "" Then Exit Sub
Const BufferSize As Long = 1000# * 1024#    '块长度,这里为1M
Dim lFileSize As Long                                   ‘文件长度
Dim FileNo As Long                                       ’文件号
Dim FileData() As Byte                                 ‘二进制数组
Dim cnn As New ADODB.Connection
Dim rs As New ADODB.Recordset
Set cnn = CurrentProject.Connection
rs.Open "tbl", cnn, 3, 3
FileNo = FreeFile                                          ‘获取文件号
Open strFileName For Binary As #FileNo          ’用二进制打开文件
lFileSize = LOF(FileNo)                                 ‘获取文件长度
rs.AddNew                                                  ’添加新记录
Do While lFileSize >= BufferSize                  ‘分块保存到fole字段
    ReDim FileData(BufferSize) As Byte
    Get FileNo, , FileData()
    rs("fOLE").AppendChunk FileData()
    DoEvents
    lFileSize = lFileSize - BufferSize
Loop
If lFileSize > 0 Then                                      ’将剩余字节保存到fole字段
   ReDim FileData(lFileSize) As Byte
   Get FileNo, , FileData()
   rs("fOLE").AppendChunk FileData()
End If
rs.Update                                                  ‘善后,关闭及卸载所有打开的对象
Close #FileNo
rs.Close
Set rs = Nothing
Set cnn = Nothing
MsgBox "导入结束"                                        '提醒
End Sub
导出模块
Sub OleToFile(strFileName As String)
If strFileName = "" Then Exit Sub
Const BufferSize As Long = 1000# * 1024#
Dim lFileSize As Long
Dim FileNo As Long
Dim FileData() As Byte
Dim cnn As New ADODB.Connection
Dim rs As New ADODB.Recordset
Set cnn = CurrentProject.Connection
rs.Open "select * from tbl where id=" & Forms("窗体1").Controls("text0"), cnn, 3, 3
FileNo = FreeFile
Open strFileName For Binary As #FileNo
lFileSize = rs("fole").ActualSize
Do While lFileSize >= BufferSize
    ReDim FileData(BufferSize) As Byte
    FileData() = rs("fole").GetChunk(BufferSize)
    Put #FileNo, , FileData()
    DoEvents
    lFileSize = lFileSize - BufferSize
Loop
If lFileSize > 0 Then
    ReDim FileData(lFileSize) As Byte
    FileData() = rs("fole").GetChunk(lFileSize)
    Put #FileNo, , FileData()
End If
Close #FileNo
rs.Close
Set rs = Nothing
Set cnn = Nothing
MsgBox "导出结束"
End Sub
8#
发表于 2010-5-18 10:29:03 | 只看该作者
一般情况导入一个300M大小的文件约2分钟,导出约30秒。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|站长邮箱|小黑屋|手机版|Office中国/Access中国 ( 粤ICP备10043721号-1 )  

GMT+8, 2024-11-17 19:50 , Processed in 0.094551 second(s), 31 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表