小弟在编写从SQL到导出数据表内容到Excel时碰到一个奇怪的问题。
SQL导出语句如下:
INSERT INTO OPENROWSET('MICROSOFT.JET.OLEDB.4.0', 'Excel 8.0;HDR=YES;DATABASE=c:\test.xls', Sheet1$)
SELECT * FROM ExcelTBL

以上语句在SQL Server Management Studio中,通过新建查询然后执行的方式可正常运行,但是同样的语句在C#中通过程序去执行就会报错,程序代码如下(各变量声明及定义略):
strSql = @"INSERT INTO OPENROWSET('MICROSOFT.JET.OLEDB.4.0', 'Excel 8.0;HDR=YES;DATABASE=c:\test.xls', Sheet1$)
SELECT * FROM ExcelTBL";
sqlconn = new SqlConnection(connectionString);
sqlconn.Open();
command = new SqlCommand(strSql, sqlconn);
command.CommandType = CommandType.Text;
command.ExecuteNonQuery(); //执行这一步时程序报错了

报错内容如下:
2009-07-19 19:58:17  导出记录时出错:链接服务器 "(null)" 的 OLE DB 访问接口 "MICROSOFT.JET.OLEDB.4.0" 报错。提供程序指示用户没有执行该操作的权限。
链接服务器 "(null)" 的 OLE DB 访问接口 "MICROSOFT.JET.OLEDB.4.0" 无法 INSERT INTO 表 "[MICROSOFT.JET.OLEDB.4.0]"。
链接服务器"(null)"的 OLE DB 访问接口 "MICROSOFT.JET.OLEDB.4.0" 返回了消息 "不能更新。数据库或对象为只读。"。

我有点想不通,为什么在SQL管理器中执行就正确,程序执行就会出错。

补充说明:test.xls已经存在,且非只读,表头行字段严格对照数据表字段定义。所以可排除是导出文件本身问题。另外SQL Server 2005中我也已经启用了“Ad Hoc Distributed Queries”,如果不启动的话在SQL查询框中也无法执行上述Insert语句。

问题仅出现在从SQL Server 2005往Excel导时出错,同样的程序代码如果从SQL Server 2000中导出到Excel一切正常。请问这到底是怎么回事,有遇到过类似情况的朋友和给我个解决方法,谢谢!