Запустить консольное приложение C# из агента SQL Server (задание)?
Это может быть очень простой вопрос, но я пытался последние 4-5 часов без успеха.:(
У меня есть консольное приложение C#, которое просто открывает файл Excel. Этот файл Excel имеет событие Workbook_Open(), которое запускает мой макрос. Мой макрос просто переименовывает sheet1 в RenameSheet1 в активном рабочем листе.
Я мог бы запустить свой проект C# из IDE. Я хочу запустить этот проект из задания 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
Я все еще получаю ту же ошибку xecuted как пользователь: CORP\shress2.
Необработанное исключение: System.Runtime.InteropServices.COMException: Microsoft Excel не может получить доступ к файлу 'E:\data_extracts\RenameSheets.xlsm'. Есть несколько возможных причин:
Имя файла или путь не существует.
Файл используется другой программой.
Книга, которую вы пытаетесь сохранить, имеет то же имя, что и текущая открытая книга. at Microsoft.Office.Interop.Excel.Workbooks.Open(Строка Имя файла, Объект UpdateLinks, Объект ReadOnly, Формат объекта, Пароль объекта, Объект WriteResPassword, Объект IgnoreReadOnlyRecommended, Источник объекта, Разделитель объектов, Редактируемый объект, Уведомить объект, Конвертер объектов, Объект AddToMru, Object Local, Object CorruptLoad) в T_OpenExcel.Program.Main(String[] args) в C:\Users\shress2\documents\visual studio 2010\projects\T_OpenExcel\T_OpenExcel\Program.cs: строка 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();
}
}
}
3 ответа
Вам просто нужно выбрать соответствующий тип задания в редакторе New Job Step. Вы можете использовать либо Powershell, либо CmdExec.
В области команд нажмите кнопку " Открыть", чтобы найти скомпилированный исполняемый файл консольного приложения (exe).
Если у вас есть какие-либо параметры, добавьте их сюда - в противном случае настройте расписание.
Возможно, вам придется использовать повышенные разрешения. Чтобы использовать повышенные разрешения, просто перейдите в " Безопасность" -> "Учетные данные" в SSMS и щелкните правой кнопкой мыши " Новые учетные данные". Затем настройте учетную запись прокси в Sql Server Agent-> Прокси и щелкните правой кнопкой мыши Новый прокси. Настройте прокси- сервер для CmdExec и используйте учетные данные, которые вы предварительно настроили. На шаге Задание агента SQL вы можете выбрать эти учетные данные, чтобы использовать их при выполнении команды.
В командной области шага задания SQL вы должны напечатать что-то вроде этого:
excel E:\data_extracts\RenameSheets.xlsm
Новая работа
CmdExec
Теперь запустите exe-файл из него
Это даст исключение.
изменить exe-код
Вы не можете иметь путь к удаленному серверу, сделать его локальным для того же сервера sql \\myserver\data_extracts\RenameSheets.xlsm в d:\data_extracts\RenameSheets.xlsm или использовать путь к файлу, куда копируется путь файла bin exe. Path.GetDirectoryName(Application.ExecutablePath), например. значение: C:\Projects\ConsoleApplication1\bin\Debug\RenameSheets.xlsm
Убедитесь, что запущен только один 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. Вы можете использовать либо Powershellor CmdExec.
В области команд нажмите кнопку "Открыть", чтобы найти скомпилированный исполняемый файл консольного приложения (exe).
Если у вас есть какие-либо параметры, добавьте их сюда - в противном случае настройте расписание.
Возможно, вам придется использовать повышенные разрешения. Чтобы использовать повышенные разрешения, просто перейдите в "Безопасность" -> "Учетные данные" в SSMS и щелкните правой кнопкой мыши "Новые учетные данные". Затем настройте учетную запись прокси в Sql Server Agent-> Прокси и щелкните правой кнопкой мыши Новый прокси. Настройте прокси-сервер для CmdExec и используйте учетные данные, которые вы предварительно настроили. На шаге Задание агента SQL вы можете выбрать эти учетные данные, чтобы использовать их при выполнении команды.
В командной области шага задания SQL вы должны напечатать что-то вроде этого:
Excel E:\data_extracts\RenameSheets.xlsm