--利用   textcopy.exe文件实现在数据库中存储/读取文件   
    
  需要textcopy.exe文件,该文件可以在sql   7.0安装光盘找到   
    
  --转贴自大力--*/   
    
  --建立存取处理的存储过程   
  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]   

解决方案 »

  1.   

    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   
        
      /*--bcp   实现二进制文件的导入导出   
        
      支持image,text,ntext字段的导入/导出   
      image适合于二进制文件,包括:Word文档,Excel文档,图片,音乐等   
      text,ntext适合于文本数据文件   
        
      注意:导入不会新增记录,所以导入前要对表进行初始化,即插入记录   
      导入时,将覆盖满足条件的所有行   
      导出时,将把所有满足条件的行导出到指定文件中   
        
        
      此存储过程仅用bcp实现   
      --邹建   2003.08---*/   
        
      /*--调用示例   
      --数据导出   
      exec   p_binaryIO   'zj','','','acc_演示数据..tb','img','c:\zj1.dat'   
        
      --数据导入   
      exec   p_binaryIO   'zj','','','acc_演示数据..tb','img','c:\zj1.dat','',0   
      --*/   
      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
      

  2.   

    'VB/VBA中实现数据库中的文件存取   
        
      '示例数据库为ACCESS数据库,用SQL数据库的话,只需要改连接字符串   
      '   
      '*************************************************************************   
      '**   
      '**   使用   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   
                
              'ACCESS数据库的连接字符串   
              iConcStr   =   "Provider=Microsoft.Jet.OLEDB.4.0;Persist   Security   Info=False"   &   _   
                      ";Data   Source=F:\My   Documents\客户资料1.mdb"   
                
      'SQL数据库的连接字符串   
              iConcStr   =   "Provider=SQLOLEDB.1;Persist   Security   Info=True;"   &   _   
                      "User   ID=用户名;Password=密码;Initial   Catalog=数据库名;Data   Source=SQL服务器名"   
              '读取文件到内容   
              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"   
        
              if   iRe("img").ActualSize>0   Then   
        
              '保存到文件   
              Set   iStm   =   New   ADODB.Stream   
              With   iStm   
                      .Mode   =   adModeReadWrite   
                      .Type   =   adTypeBinary   
                      .Open   
                      .Write   iRe("img")   
                      .SaveToFile   "c:\test.doc"   
              End   With   
                
              '关闭对象   
              iStm.Close   
      End   If   
        
              iRe.Close   
      End   Sub