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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了从SQL Server代理(作业)运行C#控制台应用程序?相关的知识,希望对你有一定的参考价值。

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

我有一个C#控制台应用程序,只需打开一个excel文件。这个excel文件有Workbook_Open()事件,它运行我的宏。我的宏只是将sheet1重命名为活动工作表中的RenameSheet1。

我可以从IDE运行我的C#项目。我想从SQL作业(SQL server 2008)运行此项目。我该怎么做?请帮我搞定。谢谢。

根据SilverNinnjas关于创建代理帐户的建议:

- 创建包含域帐户CORP PowerUser1及其密码的凭证

CREATE CREDENTIAL PowerUser1 WITH IDENTITY = N'CORPshress2', 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

我仍然得到与用户: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, "	", 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();
    }
}
}
答案

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

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

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

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

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

excel E:data_extractsRenameSheets.xlsm
另一答案

只需要在New Job Step编辑器中选择适当的Job Type。您可以使用Powershellor CmdExec。

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

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

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

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

excel E: data_extracts RenameSheets.xlsm

另一答案

新工作

的CmdExec

现在从它运行exe文件

它会给出例外。

改变exe代码。

你不能有远程服务器路径使它在同一sql server \ myserver data_extracts RenameSheets.xlsm本地到d: data_extracts RenameSheets.xlsm或使用复制bin exe文件路径的文件路径。 Path.GetDirectoryName(Application.ExecutablePath)例如。 value:C: Projects ConsoleApplication1 bin Debug RenameSheets.xlsm

确保只有一个exe正在运行,否则将会打开错误文件

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

xlApp = new 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);

   xlApp.DisplayAlerts = false;
   xlWorkBook.SaveAs("C:ProjectsConsoleApplication1inDebugRenameSheets.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;

以上是关于从SQL Server代理(作业)运行C#控制台应用程序?的主要内容,如果未能解决你的问题,请参考以下文章

从SQL Server代理作业步骤调用时,SSIS包不会运行

vb.net 运行 gpg.exe 作业步骤从 PC 运行正常,但不能从 SQL Server 代理计划运行

无法在 sql server 代理中运行作业

从存储过程执行 SQL Server 代理作业并返回作业结果

SQL Server代理(9/12):理解作业和安全

以编程方式创建 SQL Server 代理作业