簡體   English   中英

從 SQL Server 代理(作業)運行 C# 控制台應用程序?

[英]Run a C# Console Application from SQL Server Agent (Job)?

這可能是一個非常簡單的問題,但我已經嘗試了過去 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(字符串文件名、對象更新鏈接、對象只讀、對象格式、對象密碼、對象 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. Process Exit Code -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();
    }
}
}

您只需要在New Job Step編輯器中選擇合適的Job Type 您可以使用PowershellCmdExec

在命令區域中,單擊打開按鈕以找到您的控制台應用程序編譯的可執行文件 (exe)。

如果您有任何參數,請在此處添加它們 - 否則配置計划。

您可能必須使用提升的權限。 要使用提升的權限,只需導航到 SSMS 中的Security->Credentials並右鍵單擊New Credential 接下來,在Sql Server Agent->Proxies下配置Proxy Account並右鍵單擊New Proxy CmdExec配置代理並使用您之前設置的憑據 在您的 SQL 代理作業步驟中,您可以選擇此憑據以在運行您的命令時使用。

在 SQL 作業步驟命令區域中,您應該鍵入如下內容:

excel E:\data_extracts\RenameSheets.xlsm

新工作

命令執行

現在從它運行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);

   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;

只需要在 New Job Step 編輯器中選擇合適的 Job Type。 您可以使用 Powershell 或 CmdExec。

在命令區域中,單擊打開按鈕以找到您的控制台應用程序編譯的可執行文件 (exe)。

如果您有任何參數,請在此處添加它們 - 否則配置計划。

您可能必須使用提升的權限。 要使用提升的權限,只需導航到 SSMS 中的安全->憑據,然后右鍵單擊新建憑據。 接下來,在Sql Server Agent->Proxies下配置代理賬號,右鍵新建代理。 為 CmdExec 配置代理並使用您之前設置的憑據。 在您的 SQL 代理作業步驟中,您可以選擇此憑據以在運行您的命令時使用。

在 SQL 作業步驟命令區域中,您應該鍵入如下內容:

excel E:\\data_extracts\\RenameSheets.xlsm

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM