c#里从SQLSERVER导出数据到EXCEL

建议用SQL   SERVER的存储过程来实现,然后在c#里调用执行。  
  因为excel和sql   server本来就有数据访问接口,中间通过c#,效率受影响,安全性不高,出错率加大。  
   
  参考存储过程:[邹建]  
  /*--数据导出EXCEL  
   
  导出表中的数据到Excel,包含字段名,文件为真正的Excel文件  
  ,如果文件不存在,将自动创建文件  
  ,如果表不存在,将自动创建表  
  基于通用性考虑,仅支持导出标准数据类型  
   
  /*--调用示例  
   
  p_exporttb   @tbname='地区资料',@path='c:/',@fname='aa.xls'  
  --*/  
  if   exists   (select   *   from   dbo.sysobjects   where   id   =   object_id(N'[dbo].[p_exporttb]')   and   OBJECTPROPERTY(id,   N'IsProcedure')   =   1)  
  drop   procedure   [dbo].[p_exporttb]  
  GO  
   
  create   proc   p_exporttb  
  @tbname   sysname, --要导出的表名,注意只能是表名/视图名  
  @path   nvarchar(1000), --文件存放目录  
  @fname   nvarchar(250)='' --文件名,默认为表名  
  as  
  declare   @err   int,@src   nvarchar(255),@desc   nvarchar(255),@out   int  
  declare   @obj   int,@constr   nvarchar(1000),@sql   varchar(8000),@fdlist   varchar(8000)  
   
  --参数检测  
  if   isnull(@fname,'')='' set   @fname=@tbname+'.xls'  
   
  --检查文件是否已经存在  
  if   right(@path,1)<>'/'   set   @path=@path+'/'  
  create   table   #tb(a   bit,b   bit,c   bit)  
  set   @sql=@path+@fname  
  insert   into   #tb   exec   master..xp_fileexist   @sql  
   
  --数据库创建语句  
  set   @sql=@path+@fname  
  if   exists(select   1   from   #tb   where   a=1)  
  set   @constr='DRIVER={Microsoft   Excel   Driver   (*.xls)};DSN='''';READONLY=FALSE'  
          +';CREATE_DB="'+@sql+'";DBQ='+@sql  
  else  
  set   @constr='Provider=Microsoft.Jet.OLEDB.4.0;Extended   Properties="Excel   5.0;HDR=YES'  
  +';DATABASE='+@sql+'"'  
   
  --连接数据库  
  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   lberr  
   
  --创建表的SQL  
  select   @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>255   then   255   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  
  select   @sql='create   table   ['+@tbname  
  +']('+substring(@sql,2,8000)+')'  
  ,@fdlist=substring(@fdlist,2,8000)  
   
  exec   @err=sp_oamethod   @obj,'execute',@out   out,@sql  
  if   @err<>0   goto   lberr  
   
  exec   @err=sp_oadestroy   @obj  
   
  --导入数据  
  set   @sql='openrowset(''MICROSOFT.JET.OLEDB.4.0'',''Excel   5.0;HDR=YES  
  ;DATABASE='+@path+@fname+''',['+@tbname+'$])'  
   
  exec('insert   into   '+@sql+'('+@fdlist+')   select   '+@fdlist+'   from   '+@tbname)  
   
  return  
   
  lberr:  
  exec   sp_oageterrorinfo   0,@src   out,@desc   out  
  lbexit:  
  select   cast(@err   as   varbinary(4))   as   错误号  
  ,@src   as   错误源,@desc   as   错误描述  
  select   @sql,@constr,@fdlist  
  go  

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值