要求批量导出数据,导到一个excel文件里,偶尝试用ms自带存储过程master..xp_cmdshell实现,这种发放存在一个问题就是客户需要服务器数据库的master权限。那么怎么解决这个问题呢?1、要么能给客户一个批量导出的权限,但这个权限可能是master受限权限,如何给?带来的安全性问题怎么解决?
2、要么采用其他方法导出数据,数据的查询不是问题,那怎么将查询出的数据导到excel文件里呢?值得注意的是数据量可能很大 以万为单位 所以要注意速度。诚邀高手一起解决……并高分相送……

解决方案 »

  1.   

    http://dev.csdn.net/article/50/article/50/50527.shtm
    上面的是从DataTable导出数据,如果不直接从数据库导,可作参考
    我在是从datagrid导出,一天的数据就有上万条,查询比较慢,然后我先查询部分数据导出,客户端会出现下载页面,再去查询后面的数据导出。如果查询速度不是问题,单单只对数据导出,无需设置格式等,使用http://www.weste.net/2004/12-20/11440068743.html中介绍的一种方法导出速度还是可以的。
      

  2.   

    不1定要用 xp_cmdshell 。从SQLServer向Access写数据:insert into OpenRowSet('microsoft.jet.oledb.4.0',';database=c:\db2.mdb','select * from Accee表')
    select * from SQLServer表
    或用BCPmaster..xp_cmdshell'bcp "serv-htjs.dbo.serv_user" out  "c:\db3.mdb" -c -q -S"." -U"sa" -P"sa"'上面的区别主要是:OpenRowSet 需要 mdb 和 表 存在,BCP 会在不存在的时候生成该 mdb
      

  3.   

    to: bflovesnow()  用你的方法1(openrowset)提示说我的msdtc不可用?……
      

  4.   

    已拒绝对 OLE DB 提供程序 'microsoft.jet.oledb.4.0' 的特殊访问。必须通过链接服务器来访问此提供程序。是怎么回事?
      

  5.   

    to: bflovesnow() 
    我已经开了msdtc服务,可以用你的这个方法在sa用户下使用了
    但如果我已普通用户来远程操作数据库会给出提示:
    “已拒绝对 OLE DB 提供程序 'microsoft.jet.oledb.4.0' 的特殊访问。必须通过链接服务器来访问此提供程序。”不明白怎么回事
      

  6.   

    直接把数据填充为DataSet 然后用DataSet 的
      DataSet.WriteXml( filePath,System.Data.XmlWriteMode.DiffGram);
      你在把这个生成的文件保存成.xls为扩展名,在把文件连接提供给客户端。
      客户直接用Excel打开就是.xls了。
      

  7.   

    最快最可靠的方法是自己写代码导出Excel
    Private Sub writeDBDHeader(ByVal response As HttpResponse)
      Dim stream As New MemoryStream
      Dim output As New StreamWriter(stream, System.Text.Encoding.GetEncoding("GB2312"))  Try
        output.WriteLine("合同号 分公司 用户代码 用户名")
        output.Flush()
        response.BinaryWrite(stream.ToArray())
      Catch ex As Exception
      Finally
        output.Close()
      End Try
    End Sub
    注意上面的“合同号  分公司”之间是Tab符号。
    速度吗,1万行的数据需要4-8秒,在1万元的服务器上。