2012-05-21 233 views
1

我有了下面的代码一个简单的Excel文件:SQL作业无法运行C#.NET控制台应用程序

Private Sub Workbook_Open() 
    MsgBox "Hello World!" 
End Sub 

我试图运行一个SQL作业打开这个Excel文件,但它失败了,成了反应迟钝。在谷歌上搜索,我找到了原因“为什么” SQL作业不会打开Excel文件 Job On Sql Server Agent does not complete, but it does in BIDS?

所以我想创造C#一个简单的控制台应用程序这将只需打开Excel文件并运行我的宏。这里是我的代码

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(); 
     xlWorkBook = xlApp.Workbooks.Open(@"E:\data_extracts\TestHelloWorld.xlsm", 0, true, 5, "", "", true, Microsoft.Office.Interop.Excel.XlPlatform.xlWindows, "\t", false, false, 0, true, 1, 0); 
     RunMacro(xlWorkBook, new Object[] { "TestHello" }); 


     Thread.Sleep(5000); 

     xlWorkBook.Close(true, misValue, misValue); 
     xlApp.Quit(); 
    } 

    private static void RunMacro(Excel.Workbook xlWorkBook, object[] p) 
    { 
     //throw new NotImplementedException(); 
    } 
} 
} 

我可以在IDE中成功运行此代码。现在我想从SSMS中的SQL作业运行这个SQL服务器2008.

我从C#项目(T_OpenExcel - > bin - > Debug - > T_OpenExcel.exe)中抓取了T_OpenExcel.exe文件。我创建了一个SQL Job.Here是我的一些细节:

步骤名称:OpenHelloWorldExcel 类型:操作系统(CmdExec) 运行方式:SQL Server代理服务帐户 命令:C:\用户\ shress2 \文件\ Visual Studio 2010的\项目\ T_OpenExcel \ T_OpenExcel \ BIN \调试\ T_OpenExcel.exe

在运行这个工作,我得到了下面的状态 开始工作 'TestHelloWorld' 状态成功 执行工作 'TestHelloWorld' 状态错误

在查看历史记录时,显示: 消息 以用户身份执行:GSOPS4 \ SYSTEM。未处理的异常:System.Runtime.InteropServices.COMException:Microsoft Excel无法访问文件'E:\ data_extracts \ TestHelloWorld.xlsm'。 有几种可能的原因:
文件名或路径不存在。 该文件正在被另一个程序使用。 您尝试保存的工作簿与当前打开的工作簿具有相同的名称。在Microsoft.Office.Interop.Excel.Workbooks.Open(字符串文件名,对象更新链接,对象ReadOnly,对象格式,对象密码,对象WriteResPassword,对象IgnoreReadOnlyRecommended,对象源,对象分隔符,对象可编辑,对象通知,对象转换器,对象C:\ Users \ shress2 \ documents \ visual studio 2010 \ projects \ T_OpenExcel \ T_OpenExcel \ Program.cs中的T_OpenExcel.Program.Main(String [] args)中的AddToMru,Object Local,Object CorruptLoad):Process 23. Process Exit Code -532462766。该步骤失败。

我检查了E:\ data_extracts \ TestHelloWorld.xlsm目录,发现它工作正常。我确信我的xlsm文件没有被任何人使用。我无法弄清楚它为什么没有运行它。任何帮助是极大的赞赏。谢谢!

回答

1

的问题似乎是,你试图显示一个消息框,同时打开Excel文件,但你自动的,所以没有人点击该消息框按钮。其他代码无法执行,因为该文件正在等待某人点击该按钮。

在后续运行中,服务器无法访问它,因为它仍然在那里,普通用户看不见,等待按钮被点击。因此错误。

短版:不要proompt用户输入有关将要运行无人值守的应用程序。

+0

感谢您的意见。我会尝试一下我的宏 - 这不需要人为干预。谢谢。 – Nemo

+0

嗨大卫,我修改我的宏以重新命名Sheet1为RenameSheet1为简单起见。当我从IDE运行我的项目时,它提示我Excel SaveAs窗口,需要我的输入。我试图在我的代码xlApp.ActiveWorkbook.SaveCopyAs(@“E:\ data_extracts \ RenameSheets21.xlsm”)中执行SaveAs。在关闭和退出之前。但每次运行该项目时,我都会收到SaveAs提示。我在这里错过了什么吗?谢谢。 – Nemo

+0

我很少和Excel一起工作,但如果我记忆犹新,SaveAs函数有一个重载,它接受一个布尔值来指定它是否应该覆盖文件(如果存在)。当我正在挖掘我的代码以查看是否正确时,您可以尝试一下。 – David

相关问题