Esta podría ser una pregunta muy simple, pero he estado tratando durante las últimas 4-5 horas sin éxito. :(¿Ejecuta una aplicación de consola C# del Agente SQL Server (trabajo)?
que tienen una aplicación de consola de C# que simplemente abre un archivo de Excel. Este archivo de Excel tiene Workbook_Open evento(), que se extiende mi macro. Mi macro simplemente cambia el nombre sheet1 a RenameSheet1 en una hoja de cálculo activa.
I podría ejecutar mi proyecto C# desde IDE. Quiero ejecutar este proyecto desde SQL (SQL Server 2008). ¿Cómo lo hago? Por favor, ayúdenme a hacerlo funcionar. Gracias.
Según las sugerencias de SilverNinnjas para crear un cuenta de proxy:
- Cree una credencial que contenga la cuenta de dominio CORP \ PowerUser1 y su contraseña
CREATE CREDENTIAL PowerUser1 WITH IDENTITY = N'CORP\shress2', SECRET = N'[email protected]'
GO
USE [msdb]
GO
- Crear un nuevo proxy de llamada y asignar ExcelProxy la credencial de usuario avanzado a ella
EXEC msdb.dbo.sp_add_proxy
@proxy_name=N'ExcelProxy',
@credential_name=N'PowerUser1',
@enabled=1
- Conceder acceso ExcelProxy al subsistema "CmdExec"
EXEC msdb.dbo.sp_grant_proxy_to_subsystem
@proxy_name=N'ExcelProxy',
@subsystem_name =N'CmdExec'
- Subvención el usuario de inicio de sesiónUtiliza los permisos para utilizar ExcelProxy
EXEC msdb.dbo.sp_grant_login_to_proxy
@login_name = N'shress2',
@proxy_name=N'ExcelProxy'
GO
Todavía recibo el mismo error xecutado como usuario: CORP \ shress2.
Excepción no controlada: System.Runtime.InteropServices.COMException: Microsoft Excel no puede tener acceso al archivo 'E: \ data_extracts \ RenameSheets.xlsm'. Existen varias razones posibles:
El nombre o la ruta del archivo no existe.
El archivo está siendo utilizado por otro programa.
El libro de trabajo que está intentando guardar tiene el mismo nombre que un libro abierto actualmente. en 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) en T_OpenExcel.Program.Main (String [] args) en C: \ Users \ shress2 \ documents \ visual studio 2010 \ projects \ T_OpenExcel \ T_OpenExcel \ Program.cs: línea 24. Código de salida del proceso -532462766. El paso falló.
¿Alguna razón por qué? Estoy esperando ansiosamente cualquier comentario. Muchas gracias.
@SilverNinja, aquí está mi código 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();
}
}
}
me podría imaginar que la cuenta de usuario que se utiliza por defecto para ejecutar SQL Server Agent Jobs no tiene permisos suficientes para interactuar con algo que tiene una GUI interactiva como Excel tiene. Usar Aspose.Cells dentro de una aplicación de consola podría ser una solución. –
¿Su proyecto usa SQL? Si no, estarás mejor con una tarea programada. – jrummell
Intenté usar el Programador de tareas. Funciona perfectamente bien allí. El problema es que estamos utilizando SQL JOB para automatizar el proceso de alimentar el archivo Excel (en mi caso, se genera mi aplicación C#) a una herramienta de informes de terceros. Esa es la única razón para hacer que se ejecute desde el trabajo SQL. Gracias. – Nemo