2012-05-21 22 views
5

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(); 
    } 
} 
} 
+0

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. –

+1

¿Su proyecto usa SQL? Si no, estarás mejor con una tarea programada. – jrummell

+0

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

Respuesta

0

Sólo tiene que elegir el tipo adecuado de empleo en el Nuevo paso de trabajo editor. Puede usar Powershell o CmdExec.

En el área de comando, haga clic en el botón Abrir para ubicar el ejecutable compilado de la aplicación de consola (exe).

Si tiene algún parámetro, agréguelo aquí; de lo contrario, configure el programa.

Es posible que tenga que usar permisos elevados. Para usar permisos elevados, simplemente navegue hasta Security-> Credentials en SSMS y haga clic con el botón derecho en New Credential. A continuación, configure la cuenta Proxy bajo Agente de servidor SQL-> Proxies y haga clic con el botón derecho en New Proxy. Configure el Proxy para CmdExec y use las Credenciales que configuró anteriormente. En su paso de SQL Agent Job, puede elegir esta credencial para usarla al ejecutar su comando.

En el SQL de paso de trabajo Área de comandos, debe escribir algo como esto:

excel E:\data_extracts\RenameSheets.xlsm 
+0

@SilverNinja, gracias por su pronta respuesta. Lo hice. Pero falló. Usé CmdExec. Bajo comando: señalé el archivo exe generado por VS 2010 para mi aplicación de consola C#. ¿Es eso correcto? falla al ejecutar el Trabajo. Dice Excepción no controlada: System.Runtime.InteropServices.COMException: Microsoft Excel no puede acceder al archivo 'E: \ data_extracts \ RenameSheets.xlsm'. Hay varios motivos posibles: El nombre o la ruta del archivo no existe El archivo está siendo utilizado por otro programa. El libro de trabajo que está tratando de guardar tiene el mismo nombre que un libro abierto actualmente. – Nemo

+0

Agregó sus ** credenciales personalizadas ** - de forma predeterminada ** La cuenta de servicio del agente SQL ** no puede acceda al sistema de archivos. Necesita una [cuenta de proxy configurada] (http://www.sqlservercentral.com/Forums/Topic1088319-391-6.aspx#bm1099165). – SliverNinja

+1

@SilverNinja, en el área de comando, cuando podría pegar el camino a mi exe compilado, o como dijiste navegar al archivo .exe para mi proyecto. Cuando pego la ruta, se ve bien aunque falla al final. Cuando navegué por el camino, me da un código de galimatías. (copiado y pegado aquí) MZ ¿Esto es algo que está causando el problema al acceder al archivo? Por favor hagamelo saber. Gracias. – Nemo

Cuestiones relacionadas