从SQL Server代理(作业)运行C#控制台应用程序?

时间:2012-05-21 19:31:10

标签: c# .net sql sql-server-2008-r2

这可能是一个非常简单的问题,但我已经尝试过去4-5个小时没有成功。 :(

我有一个只打开excel文件的C#控制台应用程序。这个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

- 授予ExcelExxy访问“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

我仍然得到同样的错误 xecuted as user:CORP \ shress2。

  

未处理的异常:System.Runtime.InteropServices.COMException:Microsoft Excel无法访问该文件   'E:\ data_extracts \ RenameSheets.xlsm'。   有几个可能的原因:
  文件名或路径不存在   该文件正由另一个程序使用   您尝试保存的工作簿与当前打开的工作簿具有相同的名称。 at Microsoft.Office.Interop.Excel.Workbooks.Open(String Filename,Object UpdateLinks,Object ReadOnly,Object Format,Object Password,Object WriteResPassword,Object IgnoreReadOnlyRecommended,Object Origin,Object Delimiter,Object Editable,Object Notify,Object Converter,Object AddToMru,Object Local,Object CorruptLoad)位于C:\ Users \ shress2 \ documents \ visual studio 2010 \ projects \ T_OpenExcel \ T_OpenExcel \ Program.cs:第24行中的T_OpenExcel.Program.Main(String [] args)处理退出代码-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();
    }
}
}

3 个答案:

答案 0 :(得分:0)

您只需在新作业步骤编辑器中选择相应的作业类型即可。您可以使用 Powershell CmdExec

在命令区域中,单击打开按钮以找到您的控制台应用程序编译的可执行文件(exe)。

如果您有任何参数,请在此处添加 - 否则请配置计划。

您可能必须使用提升的权限。要使用提升的权限,只需导航到SSMS中的安全性 - >凭据,然后右键单击新凭据。接下来,配置 Sql Server代理 - >代理下的代理帐户,然后右键单击新代理。为 CmdExec 配置代理,并使用之前设置的凭据。在SQL代理作业步骤中,您可以选择在运行命令时使用的凭据。

在SQL作业步骤命令区域中,您应键入以下内容:

excel E:\data_extracts\RenameSheets.xlsm

答案 1 :(得分:0)

只需要在``新作业步骤''编辑器中选择适当的作业类型即可。您可以使用Powershell或CmdExec。

在``命令''区域中,单击``打开''按钮以找到您的控制台应用程序编译的可执行文件(exe)。

如果有任何参数,请在此处添加它们-否则配置时间表。

您可能必须使用提升的权限。要使用提升的权限,只需导航到SSMS中的Security-> Credentials,然后右键单击New Credential。接下来,在Sql Server代理->代理下配置``代理帐户'',然后右键单击``新代理''。为CmdExec配置代理并使用您之前设置的凭据。在“ SQL代理作业”步骤中,您可以选择运行命令时要使用的凭据。

在“ SQL Job Step命令”区域中,您应该键入以下内容:

excel E:\ data_extracts \ RenameSheets.xlsm

答案 2 :(得分:0)

新工作

CmdExec

现在从中运行exe文件

它将给出异常。

更改exe代码。

您不能将远程服务器路径设置为同一SQL Server的本地路径 \\ myserver \ data_extracts \ RenameSheets.xlsm  到d:\ data_extracts \ RenameSheets.xlsm或使用复制bin exe文件路径的文件路径。 Path.GetDirectoryName(Application.ExecutablePath) 例如。值: C:\ Projects \ ConsoleApplication1 \ bin \ Debug \ RenameSheets.xlsm

确保仅运行一个exe,否则将打开错误文件

运行exe代码 它会工作。 命令提示符无法访问网络路径。

xlApp =新的Excel.Application();         xlApp.Visible = true;         xlWorkBook = xlApp.Workbooks.Open(“ C:\ Projects \ ConsoleApplication1 \ bin \ Debug \ RenameSheets.xlsm

“,0,false,5,”“,”“,false,Microsoft.Office.Interop.Excel.XlPlatform.xlWindows,” \ t“,false,false,0,true,1、0); < / p>

   xlApp.DisplayAlerts = false;
   xlWorkBook.SaveAs("C:\Projects\ConsoleApplication1\bin\Debug\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;