c#里从SQLSERVER导出数据到EXCEL

建议用SQL   SERVER的存储过程来实现,然后在c#里调用执行。  
  因为excel和sql   server本来就有数据访问接口,中间通过c#,效率受影响,安全性不高,出错率加大。  
   
  参考存储过程:[邹建]  
  /*--数据导出EXCEL  
   
  导出表中的数据到Excel,包含字段名,文件为真正的Excel文件  
  ,如果文件不存在,将自动创建文件  
  ,如果表不存在,将自动创建表  
  基于通用性考虑,仅支持导出标准数据类型  
   
  /*--调用示例  
 

View Code
 1  
 2   p_exporttb   @tbname='地区资料',@path='c:/',@fname='aa.xls'  
 3   --*/  
 4   if   exists   (select   *   from   dbo.sysobjects   where   id   =   object_id(N'[dbo].[p_exporttb]')   and   OBJECTPROPERTY(id,   N'IsProcedure')   =   1)  
 5   drop   procedure   [dbo].[p_exporttb]  
 6   GO  
 7    
 8   create   proc   p_exporttb  
 9   @tbname   sysname, --要导出的表名,注意只能是表名/视图名  
10   @path   nvarchar(1000), --文件存放目录  
11   @fname   nvarchar(250)='' --文件名,默认为表名  
12   as  
13   declare   @err   int,@src   nvarchar(255),@desc   nvarchar(255),@out   int  
14   declare   @obj   int,@constr   nvarchar(1000),@sql   varchar(8000),@fdlist   varchar(8000)  
15    
16   --参数检测  
17   if   isnull(@fname,'')='' set   @fname=@tbname+'.xls'  
18    
19   --检查文件是否已经存在  
20   if   right(@path,1)<>'/'   set   @path=@path+'/'  
21   create   table   #tb(a   bit,b   bit,c   bit)  
22   set   @sql=@path+@fname  
23   insert   into   #tb   exec   master..xp_fileexist   @sql  
24    
25   --数据库创建语句  
26   set   @sql=@path+@fname  
27   if   exists(select   1   from   #tb   where   a=1)  
28   set   @constr='DRIVER={Microsoft   Excel   Driver   (*.xls)};DSN='''';READONLY=FALSE'  
29           +';CREATE_DB="'+@sql+'";DBQ='+@sql  
30   else  
31   set   @constr='Provider=Microsoft.Jet.OLEDB.4.0;Extended   Properties="Excel   5.0;HDR=YES'  
32   +';DATABASE='+@sql+'"'  
33    
34   --连接数据库  
35   exec   @err=sp_oacreate   'adodb.connection',@obj   out  
36   if   @err<>0   goto   lberr  
37    
38   exec   @err=sp_oamethod   @obj,'open',null,@constr  
39   if   @err<>0   goto   lberr  
40    
41   --创建表的SQL  
42   select   @sql='',@fdlist=''  
43   select   @fdlist=@fdlist+','+a.name  
44   ,@sql=@sql+',['+a.name+']   '  
45   +case   when   b.name   in('char','nchar','varchar','nvarchar')   then  
46     'text('+cast(case   when   a.length>255   then   255   else   a.length   end   as   varchar)+')'  
47   when   b.name   in('tynyint','int','bigint','tinyint')   then   'int'  
48   when   b.name   in('smalldatetime','datetime')   then   'datetime'  
49   when   b.name   in('money','smallmoney')   then   'money'  
50   else   b.name   end  
51   FROM   syscolumns   a   left   join   systypes   b   on   a.xtype=b.xusertype  
52   where   b.name   not   in('image','text','uniqueidentifier','sql_variant','ntext','varbinary','binary','timestamp')  
53   and   object_id(@tbname)=id  
54   select   @sql='create   table   ['+@tbname  
55   +']('+substring(@sql,2,8000)+')'  
56   ,@fdlist=substring(@fdlist,2,8000)  
57    
58   exec   @err=sp_oamethod   @obj,'execute',@out   out,@sql  
59   if   @err<>0   goto   lberr  
60    
61   exec   @err=sp_oadestroy   @obj  
62    
63   --导入数据  
64   set   @sql='openrowset(''MICROSOFT.JET.OLEDB.4.0'',''Excel   5.0;HDR=YES  
65   ;DATABASE='+@path+@fname+''',['+@tbname+'$])'  
66    
67   exec('insert   into   '+@sql+'('+@fdlist+')   select   '+@fdlist+'   from   '+@tbname)  
68    
69   return  
70    
71   lberr:  
72   exec   sp_oageterrorinfo   0,@src   out,@desc   out  
73   lbexit:  
74   select   cast(@err   as   varbinary(4))   as   错误号  
75   ,@src   as   错误源,@desc   as   错误描述  
76   select   @sql,@constr,@fdlist  
77   go  

 

posted @ 2013-01-28 21:32  Net-Spider  阅读(1156)  评论(0)    收藏  举报