如题,希望通过语句直接将数据库中的表导出到相应的dbf文件(VFP).通常的做法是,先建立一个dbf的表头,再执行如下语句: insert into openrowset('MSDASQL', 'Driver=Microsoft Visual FoxPro Driver;SourceType=DBF;SourceDB=H:\', 'select * from [aa.DBF]') 
select * from AA但我执行以上语句时出错,信息如下:服务器: 消息 7399,级别 16,状态 1,行 1
OLE DB 提供程序 'MSDASQL' 报错。提供程序报告了意外的灾难性错误。
[OLE/DB provider returned message: 不能更新查询,因为 FROM 子句不是单一的简单表名。]
OLE DB 错误跟踪[OLE/DB Provider 'MSDASQL' IRowsetChange::InsertRow returned 0x8000ffff:  提供程序报告了意外的灾难性错误。]。
有没有办法直接将数据表导出至dbf文件(而不是先要存在一个dbf空表)

解决方案 »

  1.   

    http://topic.csdn.net/t/20041122/23/3578424.html
    http://topic.csdn.net/t/20041210/15/3633868.html
    http://topic.csdn.net/t/20041215/15/3647916.html将   [aa.DBF]   的中括号去掉,即   
        
      insert into openrowset('MSDASQL', 'Driver=Microsoft Visual FoxPro Driver;SourceType=DBF;SourceDB=H:\', 'select * from aa.DBF') 
    select * from AA  
        
      即可解决   
      

  2.   


    首先检查是否安装了Foxpro客户端驱动。以前处理过,也是先保存一个空的DBF表。本版还没有发现直接导出为一个DBF表成功的帖子。
      

  3.   

    是呀,通过一个临时空dbf表导出就可以,关注有直接导出的
      

  4.   

    在程序中可以变通实现。如:事先建好需要导出的DBF表,存放在一个目录中,作为模板使用。每次使用时,用代码拷贝粘贴一下,将SQL Server数据追加到这个新的文件中。以前就是这么处理的。
      

  5.   

    如何在程序中实现建立一个空dbf表
      

  6.   

    如何在程序中实现建立一个空dbf表
    ----------------------------------------------
    这个好像不行。
      

  7.   

    使用PB,可以实现.
    使用其数据窗口的saveas()
      

  8.   

    --导出SQL Server表到DBF文件的存储过程
    CREATE proc exportToDBF
    @tbname sysname,          --要导出的表名
    @path nvarchar(1000),     --文件存放目录
    @fname nvarchar(250)='',  --导出的文件名,默认为表名
    @over bit=0               --是否覆盖已经存在的文件,如果不覆盖,则直接追加
    as
    declare @err int,@src nvarchar(255),@desc nvarchar(255),@out int
    declare @obj int,@constr nvarchar(1000),@sql varchar(8000),@fdlist varchar(8000)
    declare @lastsql varchar(255)--参数检测
    if isnull(@fname,'')='' set @fname=@tbname+'.dbf'--文件路径和文件名
    if right(@path,1)<>'\' set @path=@path+'\'
    create table #tb(a bit,b bit,c bit)
    set @sql=@path+@fname--判断dbf文件是否存在,如果存在返回结果a=1,b=0,c=1
    insert into #tb exec master..xp_fileexist @sql
    if exists(select 1 from #tb where a=1)
     if @over=1
      begin
       set @sql='del '+@sql
       exec master..xp_cmdshell @sql,no_output
      end
     else
      set @over=0
    else
     set @over=1--数据库创建语句
    set @sql=@path+@fname
    set @constr='Provider=Microsoft.Jet.OLEDB.4.0;Extended Properties="dBASE 5.0;'+';HDR=yes;DATABASE='+@path+'"'--连接数据库
    exec @err=sp_oacreate 'adodb.connection',@obj out
    if @err<>0 goto lberr--打开数据库
    exec @err=sp_oamethod @obj,'open',null,@constr
    if @err<>0 goto lberrselect @sql='',@fdlist=''select @fdlist=@fdlist+','+a.name,@sql=@sql+',['+a.name+'] '
               +case when b.name in('char','nchar','varchar','nvarchar') then
                                  'text('+cast(case when a.length>250 then 250 else a.length end as varchar)+')'
                  when b.name in('tynyint','int','bigint','tinyint') then 'int'
        when b.name in('smalldatetime','datetime') then 'datetime'
        when b.name in('money','smallmoney') then 'money'
        else b.name end
    FROM syscolumns a left join systypes b on a.xtype=b.xusertype
    where b.name not in('image','text','uniqueidentifier','sql_variant','ntext','varbinary','binary','timestamp')
    and object_id(@tbname)=id--建一个dbf表
    select @sql='create table ['+@fname
    +']('+substring(@sql,2,8000)+')'
    ,@fdlist=substring(@fdlist,2,8000)if @over=1
     begin
      exec @err=sp_oamethod @obj,'execute',@out out,@sql
      if @err<>0 goto lberr
     end
    exec @err=sp_oadestroy @obj--导出数据到表中
    set @sql="openrowset('MICROSOFT.JET.OLEDB.4.0','dBase 5.0;DATABASE="
            + @path+"','select * from ["+ @fname+"]')"set @lastsql='insert into '+@sql+' select * from '+@tbname
    exec(@lastsql)--删除临时表
    drop table #tbreturn--select * from heatlberr:
    exec sp_oageterrorinfo 0,@src out,@desc out
         -- raiserror ('asdfasdf',16,1)
    lbexit:
    select cast(@err as varbinary(4)) as 错误号
      ,@src as 错误源,@desc as 错误描述
    select @sql,@constr,@fdlist
    GO
      

  9.   

    用这个方法导出的dbf文件名最大长度只有8个字符...怎么解决...