【发布时间】:2012-05-28 07:36:29
【问题描述】:
这可能是一个非常简单的问题,但过去 4-5 小时我一直在尝试,但没有成功。 :(
我有一个 C# 控制台应用程序,它只打开一个 excel 文件。这个 excel 文件有 Workbook_Open() 事件,它运行我的宏。我的宏只是在活动工作表中将 sheet1 重命名为 RenameSheet1。
我可以从 IDE 运行我的 C# 项目。我想从 SQL 作业(SQL server 2008)运行这个项目。我该怎么做?请帮我完成这项工作。谢谢。
根据 SilverNinnjas 的建议创建代理帐户:
-- 创建包含域帐户 CORP\PowerUser1 及其密码的凭据
CREATE CREDENTIAL PowerUser1 WITH IDENTITY = N'CORP\shress2', SECRET = N'P@ssw0rd'
GO
USE [msdb]
GO
-- 创建一个名为 ExcelProxy 的新代理并为其分配 PowerUser 凭据
EXEC msdb.dbo.sp_add_proxy
@proxy_name=N'ExcelProxy',
@credential_name=N'PowerUser1',
@enabled=1
-- 授予 ExcelProxy 访问“CmdExec”子系统的权限
EXEC msdb.dbo.sp_grant_proxy_to_subsystem
@proxy_name=N'ExcelProxy',
@subsystem_name =N'CmdExec'
-- 授予登录testUser使用ExcelProxy的权限
EXEC msdb.dbo.sp_grant_login_to_proxy
@login_name = N'shress2',
@proxy_name=N'ExcelProxy'
GO
我仍然遇到同样的错误 以用户身份执行:CORP\shress2。
未处理的异常:System.Runtime.InteropServices.COMException:Microsoft Excel 无法访问该文件 'E:\data_extracts\RenameSheets.xlsm'。 有几个可能的原因:
文件名或路径不存在。
该文件正被另一个程序使用。
您尝试保存的工作簿与当前打开的工作簿同名。在 Microsoft.Office.Interop.Excel.Workbooks.Open(字符串文件名、对象 UpdateLinks、对象只读、对象格式、对象密码、对象 WriteResPassword、对象 IgnoreReadOnlyRecommended、对象来源、对象分隔符、对象可编辑、对象通知、对象转换器、对象AddToMru, Object Local, Object CorruptLoad) at T_OpenExcel.Program.Main(String[] args) in C:\Users\shress2\documents\visual studio 2010\projects\T_OpenExcel\T_OpenExcel\Program.cs:line 24. 进程退出代码-532462766。步骤失败。
有什么原因吗?我急切地等待任何反馈。非常感谢。
@SilverNinja, 这是我的 C# 代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Excel = Microsoft.Office.Interop.Excel;
using System.Threading;
namespace T_OpenExcel
{
class Program
{
static void Main(string[] args)
{
Excel.Application xlApp;
Excel.Workbook xlWorkBook;
//Excel.Worksheet xlWorkSheet;
object misValue = System.Reflection.Missing.Value;
xlApp = new Excel.Application();
xlApp.Visible = true;
xlWorkBook = xlApp.Workbooks.Open("\\\\myserver\\data_extracts\\RenameSheets.xlsm", 0, false, 5, "", "", false, Microsoft.Office.Interop.Excel.XlPlatform.xlWindows, "\t", false, false, 0, true, 1, 0);
xlApp.DisplayAlerts = false;
xlWorkBook.SaveAs("\\\\myserver\\data_extracts\\RenameSheets.xlsm", Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Excel.XlSaveAsAccessMode.xlNoChange, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing);
xlWorkBook.Close(true, misValue, misValue);
xlApp.DisplayAlerts = true;
xlApp.Quit();
}
private static void RunMacro(Excel.Workbook xlWorkBook, object[] p)
{
//throw new NotImplementedException();
}
}
}
【问题讨论】:
-
我认为默认情况下用于运行 SQL Server 代理作业的用户帐户没有足够的权限与具有 Excel 所具有的交互式 GUI 的东西进行交互。在控制台应用程序中使用 Aspose.Cells 可能是一种解决方案。
-
你的项目使用 SQL 吗?如果没有,您最好使用计划任务。
-
我尝试使用任务计划程序。它在那里运行得很好。问题是我们正在使用 SQL JOB 来自动化将 excel 文件(在我的情况下是我的 C# 应用程序生成)提供给第三方报告工具的过程。这是让它从 SQL 作业运行的唯一原因。谢谢。
-
我猜
E:驱动器是一个映射的网络驱动器。您可能将其映射到您的用户下,但该作业在CORP\shress2或其他任何名称下运行。尝试指定文件的 UNC 路径,例如“\\server\path\to\file\”。 -
嗨 Chris Shain,我在 C# 控制台应用程序中将 UNC 路径指定为“\\\\myserver\\data_extracts\\RenameSheets.xlsm”并成功编译/运行代码。现在我的问题是关于 SQL 作业。在命令区域下,它指向我编译的 exe 的路径,如下所示: C:\Users\shress2\Documents\visual studio 2010\projects\T_OpenExcel\T_OpenExcel\bin\Debug\T_OpenExcel.exe 我还是一样错误。 :(
标签: c# .net sql sql-server-2008-r2