用数据库存取文件的解决方法

用数据库存取文件的解决方法

用数据库保存文件有很广泛的用途,例如在数据库保存图片,或者保存有格式的资料,如Wor d 文件、报表等。虽然在大多数开发工具中都提供了这种功能,但大多语焉不详。我们在开发过程也遇到这样的需求,经过仔细分析和试验,总结了在VB 和Delphi 中往数据库中存取文件的方法,提供给各位网友共享。

在数据库方面,保存文件的字段类型是一个特殊类型,在Access 中称为OLE 对象,在Sql Server 中称为image, 在Oracle 中则是长二进制。用VB 开发可以用DAO 和ADO 两种连接数据库的方法(RDO 没用过), 这两种方法中的Field 类型都有Getchunk 和Appendchunk 两个方法,Getchunk 完成从数据库中读取二进制数据,Appendchunk 则往数据库中加二进制数据(具体可以看帮助)。利用这两个函数就可以完成与数据库交流文件的功能。

以下是用DAO 读写数据的两个函数。基本思路是,先把文件以32768个字节分为一块块,逐块读入,并保存到数据库,从数据库读出时也用同样的方法

Dim Chunk() As Byte ' 不定长二进制数组,用以保存临时数据

Const CHUNK_SIZE = 32768 ' 常量,每次读取数据的长度

Function FieldToFile(filename As String, fdObject As Field) As Boolean ' 从字段中读取数据,并保存到文件中

'filename 是文件名,fdobject 指二进制字段

Dim lChunkCount As Long

Dim lChunkRemainder As Long

Dim i As Long

Dim j As Long

On Error GoTo GG

ReDim Chunk(CHUNK_SIZE)

lChunkCount = fdObject.FieldSize / CHUNK_SIZE ' 获得文件的块数

lChunkRemainder = fdObject.FieldSize Mod CHUNK_SIZE ' 整块后余下的数据 j = FreeFile(0)

Kill filename ' 如果这个文件存在,先删除

Open filename For Binary As j ' 以二进制方式打开文件

For i = 0 To lChunkCount - 1

Chunk() = fdObject.GetChunk(i * CHUNK_SIZE, CHUNK_SIZE) ' 取一块 Put j, , Chunk() ' 将块写入临时文件

Next

If lChunkRemainder > 0 Then

ReDim Chunk(lChunkRemainder)

Chunk() = fdObject.GetChunk(lChunkCount * CHUNK_SIZE, lChunkRemaind er) ' 取余下的数据

Put j, , Chunk() ' 将其写入临时文件

End If

Close j

FieldToFile = True

Exit Function

GG: ' 错误处理

Close j

FieldToFile = False

End Function

Function fileTofield(filename As String, fdObject As Field) As Boolean ' 从文件中读取数据,保存到数据库

Dim lChunkCount As Long

Dim lChunkRemainder As Long

Dim i As Long

Dim j As Long

ReDim Chunk(CHUNK_SIZE)

lChunkCount = FileLen(filename) / CHUNK_SIZE ' 获得文件的块数

lChunkRemainder = FileLen(filename) Mod CHUNK_SIZE ' 整块后余下的数据

j = FreeFile(0)

Open filename For Binary As j

For i = 0 To lChunkCount - 1

Chunk() = InputB(CHUNK_SIZE, #j) ' 取一块

fdObject.AppendChunk Chunk() ' 写入数据库

Next

If lChunkRemainder > 0 Then

ReDim Chunk(lChunkRemainder)

Chunk() = InputB(lChunkRemainder, #j) ' 取剩下

fdObject.AppendChunk Chunk() ' 写入数据库

End If

Close j

fileTofield = True

Exit Function

KK: ' 错误处理

Close j

fileTofield = False

End Function

下面是ADO 的两个方法:

' 从字段中读取数据,并保存到文件中

Function FieldToFile(FileName As String, fdObject As ADODB.Field) As Boolean

Dim lChunkCount As Long

Dim lChunkRemainder As Long

Dim i As Long

Dim j As Long

On Error GoTo GG

FieldToFile = False

If fdObject.ActualSize = 0 Then Exit Function

ReDim Chunk(CHUNK_SIZE)

lChunkCount = fdObject.ActualSize / CHUNK_SIZE ' 获得文件的块数

lChunkRemainder = fdObject.ActualSize Mod CHUNK_SIZE ' 整块后余下的数据 j = FreeFile(0)

If Len(Dir(FileName)) Then Kill FileName

Open FileName For Binary As j

ReDim Chunk(fdObject.ActualSize)

For i = 0 To lChunkCount - 1

Chunk() = fdObject.GetChunk(CHUNK_SIZE) ' 取一块

Put j, , Chunk() ' 将块写入临时文件

Next

If lChunkRemainder > 0 Then

ReDim Chunk(lChunkRemainder)

Chunk() = fdObject.GetChunk(lChunkRemainder)

' 取余下的数据

Put j, , Chunk() ' 将其写入临时文件

End If

Close j

If (FileLen(FileName)) > 0 Then FieldToFile = True

Exit Function

GG:

MsgBox Err.Description

Close j

End Function

'从文件中读取数据,保存到数据库

Function fileTofield(FileName As String, fdObject As ADODB.Field) As Boolean

Dim lChunkCount As Long

Dim lChunkRemainder As Long

Dim i As Long

Dim j As Long

ReDim Chunk(CHUNK_SIZE)

If (FileLen(FileName))

lChunkCount = FileLen(FileName) / CHUNK_SIZE ' 获得文件的块数

lChunkRemainder = FileLen(FileName) Mod CHUNK_SIZE ' 整块后余下的数据 j = FreeFile(0)

Open FileName For Binary As j

For i = 0 To lChunkCount - 1

Chunk() = InputB(CHUNK_SIZE, #j) ' 取一块

fdObject.AppendChunk Chunk()

Next

If lChunkRemainder > 0 Then

ReDim Chunk(lChunkRemainder)

Chunk() = InputB(lChunkRemainder, #j) ' 取剩下的

fdObject.AppendChunk Chunk()

End If

Close j

fileTofield = True

Exit Function

KK:

Close j

try

XQXXB:=Tadoquery.Create(self);

XQXXB.Connection:=ADOConnection1;

MfileStream.Create(OpenPictureDialog1.FileName,fmOpenRead);

MStringStream:=TStringStream.Create('');

MStringStream.CopyFrom(MfileStream,MfileStream.Size);

XQXXB.SQL.Add('Insert into XQXXB ( 照片 ) values (:zhaopian)');

XQXXB.Parameters.ParamByName('zhaopian').LoadFromStream(MStringStream,ftBlob);

XQXXB.ExecSQL;

finally

freeandnil(MfileStream);

freeandnil(XQXXB);

freeandnil(MStringStream);

end;

end;

end;

用数据库存取文件的解决方法

用数据库保存文件有很广泛的用途,例如在数据库保存图片,或者保存有格式的资料,如Wor d 文件、报表等。虽然在大多数开发工具中都提供了这种功能,但大多语焉不详。我们在开发过程也遇到这样的需求,经过仔细分析和试验,总结了在VB 和Delphi 中往数据库中存取文件的方法,提供给各位网友共享。

在数据库方面,保存文件的字段类型是一个特殊类型,在Access 中称为OLE 对象,在Sql Server 中称为image, 在Oracle 中则是长二进制。用VB 开发可以用DAO 和ADO 两种连接数据库的方法(RDO 没用过), 这两种方法中的Field 类型都有Getchunk 和Appendchunk 两个方法,Getchunk 完成从数据库中读取二进制数据,Appendchunk 则往数据库中加二进制数据(具体可以看帮助)。利用这两个函数就可以完成与数据库交流文件的功能。

以下是用DAO 读写数据的两个函数。基本思路是,先把文件以32768个字节分为一块块,逐块读入,并保存到数据库,从数据库读出时也用同样的方法

Dim Chunk() As Byte ' 不定长二进制数组,用以保存临时数据

Const CHUNK_SIZE = 32768 ' 常量,每次读取数据的长度

Function FieldToFile(filename As String, fdObject As Field) As Boolean ' 从字段中读取数据,并保存到文件中

'filename 是文件名,fdobject 指二进制字段

Dim lChunkCount As Long

Dim lChunkRemainder As Long

Dim i As Long

Dim j As Long

On Error GoTo GG

ReDim Chunk(CHUNK_SIZE)

lChunkCount = fdObject.FieldSize / CHUNK_SIZE ' 获得文件的块数

lChunkRemainder = fdObject.FieldSize Mod CHUNK_SIZE ' 整块后余下的数据 j = FreeFile(0)

Kill filename ' 如果这个文件存在,先删除

Open filename For Binary As j ' 以二进制方式打开文件

For i = 0 To lChunkCount - 1

Chunk() = fdObject.GetChunk(i * CHUNK_SIZE, CHUNK_SIZE) ' 取一块 Put j, , Chunk() ' 将块写入临时文件

Next

If lChunkRemainder > 0 Then

ReDim Chunk(lChunkRemainder)

Chunk() = fdObject.GetChunk(lChunkCount * CHUNK_SIZE, lChunkRemaind er) ' 取余下的数据

Put j, , Chunk() ' 将其写入临时文件

End If

Close j

FieldToFile = True

Exit Function

GG: ' 错误处理

Close j

FieldToFile = False

End Function

Function fileTofield(filename As String, fdObject As Field) As Boolean ' 从文件中读取数据,保存到数据库

Dim lChunkCount As Long

Dim lChunkRemainder As Long

Dim i As Long

Dim j As Long

ReDim Chunk(CHUNK_SIZE)

lChunkCount = FileLen(filename) / CHUNK_SIZE ' 获得文件的块数

lChunkRemainder = FileLen(filename) Mod CHUNK_SIZE ' 整块后余下的数据

j = FreeFile(0)

Open filename For Binary As j

For i = 0 To lChunkCount - 1

Chunk() = InputB(CHUNK_SIZE, #j) ' 取一块

fdObject.AppendChunk Chunk() ' 写入数据库

Next

If lChunkRemainder > 0 Then

ReDim Chunk(lChunkRemainder)

Chunk() = InputB(lChunkRemainder, #j) ' 取剩下

fdObject.AppendChunk Chunk() ' 写入数据库

End If

Close j

fileTofield = True

Exit Function

KK: ' 错误处理

Close j

fileTofield = False

End Function

下面是ADO 的两个方法:

' 从字段中读取数据,并保存到文件中

Function FieldToFile(FileName As String, fdObject As ADODB.Field) As Boolean

Dim lChunkCount As Long

Dim lChunkRemainder As Long

Dim i As Long

Dim j As Long

On Error GoTo GG

FieldToFile = False

If fdObject.ActualSize = 0 Then Exit Function

ReDim Chunk(CHUNK_SIZE)

lChunkCount = fdObject.ActualSize / CHUNK_SIZE ' 获得文件的块数

lChunkRemainder = fdObject.ActualSize Mod CHUNK_SIZE ' 整块后余下的数据 j = FreeFile(0)

If Len(Dir(FileName)) Then Kill FileName

Open FileName For Binary As j

ReDim Chunk(fdObject.ActualSize)

For i = 0 To lChunkCount - 1

Chunk() = fdObject.GetChunk(CHUNK_SIZE) ' 取一块

Put j, , Chunk() ' 将块写入临时文件

Next

If lChunkRemainder > 0 Then

ReDim Chunk(lChunkRemainder)

Chunk() = fdObject.GetChunk(lChunkRemainder)

' 取余下的数据

Put j, , Chunk() ' 将其写入临时文件

End If

Close j

If (FileLen(FileName)) > 0 Then FieldToFile = True

Exit Function

GG:

MsgBox Err.Description

Close j

End Function

'从文件中读取数据,保存到数据库

Function fileTofield(FileName As String, fdObject As ADODB.Field) As Boolean

Dim lChunkCount As Long

Dim lChunkRemainder As Long

Dim i As Long

Dim j As Long

ReDim Chunk(CHUNK_SIZE)

If (FileLen(FileName))

lChunkCount = FileLen(FileName) / CHUNK_SIZE ' 获得文件的块数

lChunkRemainder = FileLen(FileName) Mod CHUNK_SIZE ' 整块后余下的数据 j = FreeFile(0)

Open FileName For Binary As j

For i = 0 To lChunkCount - 1

Chunk() = InputB(CHUNK_SIZE, #j) ' 取一块

fdObject.AppendChunk Chunk()

Next

If lChunkRemainder > 0 Then

ReDim Chunk(lChunkRemainder)

Chunk() = InputB(lChunkRemainder, #j) ' 取剩下的

fdObject.AppendChunk Chunk()

End If

Close j

fileTofield = True

Exit Function

KK:

Close j

try

XQXXB:=Tadoquery.Create(self);

XQXXB.Connection:=ADOConnection1;

MfileStream.Create(OpenPictureDialog1.FileName,fmOpenRead);

MStringStream:=TStringStream.Create('');

MStringStream.CopyFrom(MfileStream,MfileStream.Size);

XQXXB.SQL.Add('Insert into XQXXB ( 照片 ) values (:zhaopian)');

XQXXB.Parameters.ParamByName('zhaopian').LoadFromStream(MStringStream,ftBlob);

XQXXB.ExecSQL;

finally

freeandnil(MfileStream);

freeandnil(XQXXB);

freeandnil(MStringStream);

end;

end;

end;


相关文章

  • 大数据平台系统项目安全保障
  • 大数据平台系统项目 安全保障 安全是系统正常运行的保证.根据本项目的业务特点和需要,以及现有的网络安全状况,建立一个合理.实用.先进.可靠.综合.统一的安全保障体系,确保信息安全和业务系统的正常运行. 一. 规章制度建设 1.1 机房管理制 ...查看


  • 郑州大学操作系统期末考试重点整理
  • 提供各种服务.合理组织计算机工作流程和为用户有效使用计算机提供良好运行环境的一种系统软件. 资源管理1资源复用(空分复用共享,, 时分复用共享)2资源虚化3资源抽象4组合使用抽象和虚化技术 1)进程抽象(2)虚存抽象(3)文件抽象(4)其他 ...查看


  • 浅析多媒体数据库的关键技术
  • 摘要:多媒体资料是以文件的形式在计算机上存储的,它利用各种操作系统的文件管理功能就可以实现存储管理.文件系统方式存储简单,当多媒体资料较少时,浏览查询还能接受,但演播的资料格式受到限制,最主要的是当多媒体资料的数量和种类相当多时,查询和演播 ...查看


  • 电脑报价管理系统
  • 目录 第一章 概述 ............................................... 1 第二章 问题定义 ........................................... 2 第三章 需 ...查看


  • 电气应用软件中数据组织方法的现状与发展
  • 电气应用软件中数据组织方法的现状与发展 作者:杨道驰 来源:<电子世界>2013年第13期 [摘要]各种电气应用软件都要处理大量的数据.需要将这些数据有序地组织起来,才能对数据进行有效的处理.如何组织这些数据,即首先必须解决这些 ...查看


  • 数据库系统习题解答
  • 一. 1.试述数据.数据库.数据库管理系统.数据库系统的概念? 答: (l )数据( Data ) :描述事物的符号记录称为数据.数据的种类有数字.文字.图形.图像.声音.正文等.数据与其语义是不可分的. (2)数据库( DataBase ...查看


  • 小型超市收银系统的设计与实现
  • 学号 题目: 作 者 届 别 院 别 专 业 指导教师职 称 完成时间 摘 要 随着销售行业竞争日益激烈,小型超市收银系统的引入显得极其重要.它不但可以提高进销存管理的工作效率,而且可以有效减少盲目采购.降低采购成本.合理控制库存.减少资金 ...查看


  • 计算机二级基础知识选择题
  • 选择题 (1)下面叙述正确的是(C) A. 算法的执行效率与数据的存储结构无关B. 算法的空间复杂度是指算法程序中指令(或语句)的条数C. 算法的有穷性是指算法必须能在执行有限个步骤之后终止D. 以上三种描述都不对 (2)以下数据结构中不属 ...查看


  • 科普趣味知识竞赛--计算机部分
  • 知识竞赛(计算机部分) 简单题 1.多媒体计算机是指( C ) A . 具有多种外部设备的计算机 B . 能与多种媒体设备连接的计算机 C . 能处理多种媒体的计算机 D . 借助多种媒体操作的计算机 2.电子数字计算机工作最重要的特征是( ...查看


热门内容