从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 代理计划运行