我从SQL SERVER读出流数据,(例如是一WORD格式的文档)存成临时文件--TBlobField(FieldByName('content')).SaveToFile(filepath);
打开临时文件--ShellExecute(handle,'open',Pchar(filepath),nil,nil,sw_show);
打开作修改后,保存,只能保存到临时文件中,怎样才可以直接保存到数据库中(以文件流的形式)?

解决方案 »

  1.   

    修改之后再把临时文件中的数据保存到数据库中去啊。Edit;
    TBlobField(FieldByName('content')).LoadFromFile(filepath);//??
    Post;
      

  2.   

    我觉得你用ShellExecute来打开和处理文件的办法不对,这样虽然处理文件比较简单,比如WORD文档什么的。但是和你的程序的关联就不打了,你没有办法去控制第三方的程序。
    应该把处理文件的功能按某中形势做到你的程序中来,比如用DDE,OLE等,这样才能及时得到文件变化的信息,进行保存
      

  3.   

    其实很简单的你既然处理的是数据库那为何不用存储过程那.前端开发工具只是处理而已.
    用这个存储过程就可以搞定啦./*--实现数据导入/导出的存储过程 可以实现导入/导出 指定表 到文本文件邹建 2003.07-----------------*//*--调用示例
    导出调用示例
    --导出指定表,这里指定导出表:地区资料 和 基本信息,文件名前缀为:zj
    exec file2table 'zj','','','c:\zj.txt','xzkh_sa..地区资料'导入调用示例
    --导入指定表,这里指定导出表:地区资料 和 基本信息,文件名前缀为:zj
    exec file2table 'zj','','','c:\zj.txt','xzkh_sa..地区资料',0
    --*/if exists(select 1 from sysobjects where name='File2Table' and objectproperty(id,'IsProcedure')=1)
    drop procedure File2Table
    gocreate procedure File2Table
    @servername varchar(200) --服务器名
    ,@username varchar(200) --用户名,如果用NT验证方式,则为空''
    ,@password varchar(200) --密码
    ,@filename varchar(1000) --目录名+文件名
    ,@tbname varchar(500)='' --数据库..表名
    ,@isout bit=1 --1为导出(默认),0为导入
    as
    declare @sql varchar(8000)set @sql='bcp "'+@tbname
    +case when @isout=1 then '" out' else '" in' end
    +' "'+@filename+'" /w' +' /S"'+@servername
    +case when isnull(@username,'')='' then '' 
    else '" /U"'+@username end
    +'" /P"'+isnull(@password,'')+'"'
    exec master..xp_cmdshell @sql
    go
    参考一下了方法:
    1、建立过程
    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)) 
    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  2、建表和初始化数据
    create table 表名 (编号 int,image列名 image)
    go
    insert 表名 values(1,0x)
    insert 表名 values(2,0x)
    go3、读入
    sp_textcopy '你的服务器名','sa','你的密码','库名','表名','image列名','c:\图片.bmp','where 编号=1','I' --注意条件是 编号=1sp_textcopy '你的服务器名','sa','你的密码','库名','表名','image列名','c:\bb.doc','where 编号=2','I' --注意条件是 编号=2go4、读出成文件
    sp_textcopy '你的服务器名','sa','你的密码','库名','表名','image列名','c:\图片.bmp','where 编号=1','O' --注意条件是 编号=1sp_textcopy '你的服务器名','sa','你的密码','库名','表名','image列名','c:\bb.doc','where 编号=2','O' --注意条件是 编号=2
    go
    调用示例有点错误,改正如下:/*--调用示例
    导出调用示例
    --导出指定表,这里指定导出表:地区资料
    exec file2table 'zj','','','c:\zj.txt','xzkh_sa..地区资料'导入调用示例
    --导入指定表,这里指定导出表:地区资料
    exec file2table 'zj','','','c:\zj.txt','xzkh_sa..地区资料',0
    --*/
    sql server中没有LongText这个类型,如果是字符型,可以用上面的存储过程,如果是text或者ntext类型,可以用下面的存储过程./*--bcp-二进制文件的导入导出 支持image,text,ntext字段的导入/导出
    image适合于二进制文件;text,ntext适合于文本数据文件 注意:导入时,将覆盖满足条件的所有行
    导出时,将把所有满足条件的行也出到指定文件中 此存储过程仅用bcp实现
    邹建 2003.08-----------------*//*--调用示例
    --数据导出
    exec p_binaryIO 'zj','','','acc_演示数据..test','memo','c:\memo.txt'--数据导出
    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]
    GOCreate proc p_binaryIO
    @servename varchar (30),--服务器名称
    @username varchar (30), --用户名
    @password varchar (30), --密码
    @tbname varchar (500),  --数据库..表名
    @fdname varchar (30),  --字段名
    @fname varchar (1000), --目录+文件名,处理过程中要使用/覆盖:@filename+.bak
    @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
    endend--生成数据处理应答文件
    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 @sqlgo
    zjcxc(邹建) 
    大哥,你的办法确实很好,感谢!
    但是我担心很多SQL为了安全都把xplog70.dll删除了,就用不起xp_cmdshell了,该怎么办啦?----xml
    建立例子模版:在C:\下新建内容为下面的一“模版.htp”
        <%insert_data_here%>再:
      exec sp_makewebtask 'c:\模版实例.txt','select distinct MOBILE_PICTYPE.MOBILE_PICTYPE_NO,
           leaf.BRAND,
           MOBILE_PICTYPE.MOBILE_TYPE_NO mobile_type_no0,
           MOBILE_PICTYPE.MOBILE_PICTYPE_NAME,
           MOBILE_PICTYPE.PIC_WIDTH,
           MOBILE_PICTYPE.PIC_HEIGHT,
           MOBILE_PICTYPE.IMAGE_FORMAT,
           MOBILE_PICTYPE.SCREEN_X,MOBILE_PICTYPE.SCREEN_Y,
           MOBILE_PICTYPE.COLOR_BIT,
           MOBILE_PICTYPE.MAX_DES_LEN,
           MOBILE_PICTYPE.MAX_PIC_LEN,
           MOBILE_PICTYPE.PIC_PROGID,
           MOBILE_PICTYPE.PROTOCOL_NAME,
           MOBILE_PICTYPE.STATIC_SERVICE_ID,
           MOBILE_PICTYPE.ANI_SERVICE_ID,
           MOBILE_PICTYPE.SUB_SERVICE_ID,
           MOBILE_PICTYPE.MONTH_SERVICE_ID,
           leaf.MOBILE_TYPE_NO,leaf.MODEL
    from xcdb.dbo.mobile_pictype (select distinct MOBILE_TYPE_NO,BRAND,MODEL from xcdb.dbo.MOBILE) leaf,
           MOBILE_PICTYPE
    where leaf.MOBILE_TYPE_NO=MOBILE_PICTYPE.MOBILE_TYPE_NO for xml auto',@templatefile='c:\模版.htp',@lastupdated=0,@resultstitle='  ',@charset='gb2312'