数据库中存/取文件

--SQL数据库中用image来存储文件,ACCESS中用ole对象来存储文件,下面给出几种方法,实现数据库中文件的存储/读取.

 

  --方法.bcp

  /*--bcp 实现二进制文件的导入导出

 

  支持image,text,ntext字段的导入/导出

  image适合于二进制文件,包括:Word文档,Excel文档,图片,音乐等

  text,ntext适合于文本数据文件

 

  注意:导入时,将覆盖满足条件的所有行

  导出时,将把所有满足条件的行导出到指定文件中

 

 

  此存储过程仅用bcp实现

  邹建2003.08-----------------*/

  --整理:Tony 2010.4

 

  /*--调用示例

  --数据导出

  exec p_binaryIO 'zj','','','acc_演示数据..tb','img','c:/zj1.dat'

 

  --数据导入

  exec p_binaryIO 'zj','','','acc_演示数据..tb','img','c:/zj1.dat','',0

  --*/

  if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[p_binaryIO]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)

  drop procedure [dbo].[p_binaryIO]

  GO

  Create proc p_binaryIO

  @servename varchar (30),--服务器名称

  @username varchar (30), --用户名

  @password varchar (30), --密码

  @tbname varchar (500), --数据库..表名

  @fdname varchar (30), --字段名

  @fname varchar (1000), --目录+文件名,处理过程中要使用/覆盖:@filename+_temp

  @tj varchar (1000)='', --处理条件.对于数据导入,如果条件中包含@fdname,请指定表名前缀

  @isout bit=1 --1导出((默认),0导入

  AS

  declare @fname_in varchar(1000) --bcp处理应答文件名

      ,@fsize varchar(20) --要处理的文件的大小

      ,@m_tbname varchar(50) --临时表名

      ,@sql varchar(8000)

 

  --则取得导入文件的大小

  if @isout=1

    set @fsize='0'

  else

  begin

      create table #tb(可选名 varchar(20),大小 int

         ,创建日期 varchar(10),创建时间 varchar(20)

         ,上次写操作日期 varchar(10),上次写操作时间 varchar(20)

         ,上次访问日期 varchar(10),上次访问时间 varchar(20),特性 int)

      insert into #tb

      exec master..xp_getfiledetails @fname

      select @fsize=大小 from #tb

      drop table #tb

      if @fsize is null

      begin

         print '文件未找到'

         return

      end

  end

 

  --生成数据处理应答文件

  set @m_tbname='[##temp'+cast(newid() as varchar(40))+']'

  set @sql='select * into '+@m_tbname+' from(

      select null as 类型

      union all select 0 as 前缀

      union all select '+@fsize+' as 长度

      union all select null as 结束

      union all select null as 格式

      ) a'

  exec(@sql)

  select @fname_in=@fname+'_temp'

      ,@sql='bcp "'+@m_tbname+'" out "'+@fname_in

      +'" /S"'+@servename

      +case when isnull(@username,'')='' then ''

     else '" /U"'+@username end

      +'" /P"'+isnull(@password,'')+'" /c'

  exec master..xp_cmdshell @sql

  --删除临时表

  set @sql='drop table '+@m_tbname

  exec(@sql)

 

  if @isout=1

  begin

      set @sql='bcp "select top 1 '+@fdname+' from '

         +@tbname+case isnull(@tj,'') when '' then ''

         else ' where '+@tj end

         +'" queryout "'+@fname

         +'" /S"'+@servename

         +case when isnull(@username,'')='' then ''

         else '" /U"'+@username end

         +'" /P"'+isnull(@password,'')

         +'" /i"'+@fname_in+'"'

      exec master..xp_cmdshell @sql

  end

  else

  begin

      --为数据导入准备临时表

      set @sql='select top 0 '+@fdname+' into '

         +@m_tbname+' from ' +@tbname

      exec(@sql)

     

      --将数据导入到临时表

     set @sql='bcp "'+@m_tbname+'" in "'+@fname

         +'" /S"'+@servename

         +case when isnull(@username,'')='' then ''

         else '" /U"'+@username end

         +'" /P"'+isnull(@password,'')

         +'" /i"'+@fname_in+'"'

      exec master..xp_cmdshell @sql

     

      --将数据导入到正式表中

      set @sql='update '+@tbname

         +' set '+@fdname+'=b.'+@fdname

         +' from '+@tbname+' a,'

         +@m_tbname+' b'

         +case isnull(@tj,'') when '' then ''

        else ' where '+@tj end

      exec(@sql)

     

      --删除数据处理临时表

      set @sql='drop table '+@m_tbname

  end

  --删除数据处理应答文件

  set @sql='del '+@fname_in

  exec master..xp_cmdshell @sql

  go

 

------------------------------------------------------

/*--利用textcopy.exe文件实现在数据库中存储/读取文件

 

  需要textcopy.exe文件,该文件可以在sql 7.0安装光盘找到

 

  --转贴自大力--*/

  --整理:Tony 2010.4

 

  --建立存取处理的存储过程

  if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[sp_textcopy]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)

  drop procedure [dbo].[sp_textcopy]

  GO

  CREATE PROCEDURE sp_textcopy

  @srvname varchar (30), --服务器名

  @login varchar (30), --用户名

  @password varchar (30), --密码

  @dbname varchar (30), --数据库名

  @tbname varchar (30), --表名

  @colname varchar (30), --存储文件的字段名

  @filename varchar (30), --要存取的文件名

  @whereclause varchar (40), --条件

  @direction char(1) --I 为存储到数据库,O 从数据库中读出成文件

  AS

  DECLARE @exec_str varchar (255)

  SELECT @exec_str =

  'textcopy /S ' + @srvname +

  ' /U ' + @login +

  ' /P ' + @password +

  ' /D ' + @dbname +

  ' /T ' + @tbname +

  ' /C ' + @colname +

  ' /W "' + @whereclause +

  '" /F ' + @filename +

  ' /' + @direction

  EXEC master..xp_cmdshell @exec_str

  GO

 

  --调用示例:

  --1.创建示例表和初始化数据

  create table tb(id int,img image)

      insert tb

      select 1,0x

      union all select 2,0x

      go

 

  --2.将文件保存到数据库中

  declare @srv varchar(255),@db sysname,@tb sysname,@col sysname

  select @srv=@@servername --服务器名

      ,@db=db_name() --数据库名

      ,@tb='tb' --表名

      ,@col='img' --列名

  sp_textcopy @srv,'sa','sa的密码',@db,@tb,@col,'c:/test.jpg','where id=1','I' --保存到id=1的记录中,注意条件是:id=1

  sp_textcopy @srv,'sa','sa的密码',@db,@tb,@col,'c:/test.doc','where id=2','I' --保存到id=2的记录中,注意条件是:id=2

 

  --3.从数据库中读出保存为文件

  sp_textcopy @srv,'sa','sa的密码',@db,@tb,@col,'c:/test.jpg','where id=1','O' --读出id=1的记录,注意条件是:id=1

  sp_textcopy @srv,'sa','sa的密码',@db,@tb,@col,'c:/test.doc','where id=2','O' --读出id=2的记录,注意条件是:id=2

 

  --删除测试环境

  drop table tb

  if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[sp_textcopy]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)

  drop procedure [dbo].[sp_textcopy]

 

  ----------------------------------------------------------

 /*

上面两种方法是用存储过程实现,因为SQL的语句是在服务器上执行的,所以上面存/取的文件目录都是基于服务器的.

 

  下面给出用程序实现的两种方法.

 

 

  方法.ADO.Stream对象,VB程序为例子

  '*************************************************************************

  '**

  '** 使用ADODB.Stream 保存/读取文件到数据库

  '** 引用Microsoft ActiveX Data Objects 2.5 Library 及以上版本

  '**

  '** ----- 数据库连接字符串模板---------------------------------------

  '** ACCESS数据库

  '** iConcStr = "Provider=Microsoft.Jet.OLEDB.4.0;Persist Security Info=False" & _

  '** ";Data Source=数据库名"

  '**

  '** SQL数据库

  '** iConcStr = "Provider=SQLOLEDB.1;Persist Security Info=True;" & _

  '** "User ID=用户名;Password=密码;Initial Catalog=数据库名;Data Source=SQL服务器名"

  '**

  '*************************************************************************

  '

  '保存文件到数据库中

  Sub s_SaveFile()

  Dim iStm As ADODB.Stream

  Dim iRe As ADODB.Recordset

  Dim iConcStr As String

 

  '数据库连接字符串

  iConcStr = "Provider=Microsoft.Jet.OLEDB.4.0;Persist Security Info=False" & _

  ";Data Source=F:/My Documents/客户资料.mdb"

 

  '读取文件到内容

  Set iStm = New ADODB.Stream

  With iStm

  .Type = adTypeBinary '二进制模式

  .Open

  .LoadFromFile "c:/test.doc"

  End With

 

  '打开保存文件的表

  Set iRe = New ADODB.Recordset

  With iRe

  .Open "", iConc, adOpenKeyset, adLockOptimistic

  .AddNew '新增一条记录

  .Fields("保存文件内容的字段") = iStm.Read

  .Update

  End With

 

  '完成后关闭对象

  iRe.Close

  iStm.Close

  End Sub

 

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

  Sub s_ReadFile()

  Dim iStm As ADODB.Stream

  Dim iRe As ADODB.Recordset

  Dim iConc As String

 

  '数据库连接字符串

  iConc = "Provider=Microsoft.Jet.OLEDB.4.0;Persist Security Info=False" & _

  ";Data Source=//xz/c$/Inetpub/zj/zj/zj.mdb"

 

  '打开表

  Set iRe = New ADODB.Recordset

  iRe.Open "tb_img", iConc, adOpenKeyset, adLockReadOnly

  iRe.Filter = "id=64"

 

  '保存到文件

  Set iStm = New ADODB.Stream

  With iStm

  .Mode = adModeReadWrite

  .Type = adTypeBinary

  .Open

  .Write iRe("img")

  .SaveToFile "c:/test.doc"

  End With

 

  '关闭对象

  iRe.Close

  iStm.Close

  End Sub

*/

 

----------------------------------

/*

'==================================================================--

  '

  ' ASP实现无组件上传/下载文件

  '

  ' 功能简介

  ' 将上传的文件数据保存到数据库中,可以处理表单中的多个上传文件的情况

  ' 适用于各种数据库,使用ADO的方法连接数据库

  ' 本示例中使用的是ACCESS数据库:zj.mdb

  ' :tb_img(id int(自增列),path text(255) 保存上传文件的目录

  ' ,fname text(250) 保存上传的文件名,type test(250) 保存上传文件的类型

  '       ,img ole对象保存上传的文件内容

  '

  ' 邹建  2003.10

  '==================================================================

 

 

  '==================================================================

  '

  ' 上传文件的HTML: zj_up.htm

  '

  '==================================================================

  <html>

  <head>

  <title>文件上传保存到数据库中</title>

  </head>

  <body>

  <form name="form1" enctype="multipart/form-data" method="post" action="zj_up.asp">

  <p>

    <input type="file" name="file">

    <input type="submit" name="Submit" value="上传">

  </p>

  </form>

  </body>

  </html>

 

 

  '==================================================================

  '

  ' 上传文件保存到数据库的ASP: zj_up.asp

  '

  '==================================================================

  <%

  Response.Expires=0

  Function f_Bin2Str(ByVal sBin)

    Dim iI, iLen, iChr, iRe      

    iRe = ""

    If Not IsNull(sBin) Then

      iLen = LenB(sBin)

      For iI = 1 To iLen

          iChr = MidB(sBin, iI, 1)

          If AscB(iChr) > 127 Then

            iRe = iRe & Chr(AscW(MidB(sBin, iI + 1, 1) & iChr))

            iI = iI + 1

          Else

            iRe = iRe & Chr(AscB(iChr))

          End If

      Next

    End If    

    f_Bin2Str = iRe

  End Function

  iConcStr = "Provider=Microsoft.Jet.OLEDB.4.0;Persist Security Info=False" & _  

  ";Data Source=" & server.mappath("zj.mdb")

  iSql="tb_img"

  set iRe=Server.CreateObject("ADODB.Recordset")

  iRe.Open iSql,iConcStr,1,3

  iLen=Request.TotalBytes

  sBin=Request.BinaryRead(iLen)

  iCrlf1 = ChrB(13) & ChrB(10)

  iCrlf2 = iCrlf1 & iCrlf1

  iLen = InStrB(1, sBin, iCrlf1) - 1

  iSpc = LeftB(sBin, iLen)

  sBin = MidB(sBin, iLen + 34)

  iPos1 = InStrB(sBin, iCrlf2) - 1

  While iPos1 > 0

  iStr = f_Bin2Str(LeftB(sBin, iPos1))

  iPos1 = iPos1 + 5

  iPos2 = InStrB(iPos1, sBin, iSpc)

 

  iPos3 = InStr(iStr, "; filename=""") + 12

  If iPos3 > 12 Then

  iStr = Mid(iStr, iPos3)

  iPos3 = InStr(iStr, Chr(13) & Chr(10) & "Content-Type: ") - 2

  iFn = Left(iStr, iPos3)

  If iFn <> "" Then

  iRe.AddNew

  ire("path")=left(iFn,instrrev(iFn,"/"))

  iRe("fname") = mid(iFn,instrrev(iFn,"/")+1)

  iRe("type") = Mid(iStr, iPos3 + 18)

  iRe("img").AppendChunk MidB(sBin, iPos1, iPos2 - iPos1)

  iRe.Update

  End If

  End If

 

  sBin = MidB(sBin, iPos2 + iLen + 34)

  iPos1 = InStrB(sBin, iCrlf2) - 1

  Wend

  iRe.close

  set iRe=Nothing

  %>

 

  '==================================================================

  '

  ' 下载数据的ASP: zj_down.asp

  '

  '==================================================================

  <%

  Response.Buffer=true

  Response.Clear

 

  iConcStr = "Provider=Microsoft.Jet.OLEDB.4.0;Persist Security Info=False" & _  

  ";Data Source=" & server.mappath("zj.mdb")

  set iRe=server.createobject("adodb.recordset")

  iSql="tb_img"

  iRe.open iSql,iconcstr,1,1

  Response.ContentType=ire("type")

  Response.BinaryWrite iRe("img")

 

  iRe.close

  set iRe=Nothing

  %>

*/

 

 来源:http://topic.csdn.net/t/20031028/16/2403509.html

  • 0
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值