【问题标题】:SQL job failed to run a C#.net console applicationSQL 作业无法运行 C#.net 控制台应用程序
【发布时间】:2012-05-28 04:23:16
【问题描述】:

我有一个简单的 excel 文件,其中包含以下代码:

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 server 2008。

我从我的 C# 项目中获取了 T_OpenExcel.exe 文件(T_OpenExcel-->bin-->Debug-->T_OpenExcel.exe)。我创建了一个 SQL 作业。以下是我的一些详细信息:

步骤名称:OpenHelloWorldExcel 类型:操作系统(CmdExec) 运行方式:SQL Server 代理服务帐户 命令:C:\Users\shress2\Documents\visual studio 2010\projects\T_OpenExcel\T_OpenExcel\bin\Debug\T_OpenExcel.exe

在运行此作业时,我得到以下状态 启动作业“TestHelloWorld”状态成功 执行作业“TestHelloWorld”状态错误

在查看历史记录中,它显示: 信息 以用户身份执行:GSOPS4\SYSTEM。未处理的异常:System.Runtime.InteropServices.COMException:Microsoft Excel 无法访问文件“E:\data_extracts\TestHelloWorld.xlsm”。 有几个可能的原因:
文件名或路径不存在。 该文件正被另一个程序使用。 您尝试保存的工作簿与当前打开的工作簿同名。在 Microsoft.Office.Interop.Excel.Workbooks.Open(字符串文件名、对象 UpdateLinks、对象只读、对象格式、对象密码、对象 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 23. 进程退出代码-532462766。步骤失败。

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

【问题讨论】:

    标签: c# sql-server sql-server-2008 excel vba


    【解决方案1】:

    问题似乎是您试图在打开 Excel 文件时显示一个消息框,但您正在自动执行它,因此没有人可以单击消息框上的按钮。其余代码无法执行,因为文件正坐在那里等待有人点击按钮。

    在随后的运行中,服务器无法访问它,因为它仍然坐在那里,对普通用户不可见,等待点击按钮。因此出现错误。

    短版:不要在无人看管的应用上提示用户输入。

    【讨论】:

    • 感谢您的意见。我会用我的宏尝试一些不需要人工干预的东西。谢谢。
    • 嗨,David,为了简单起见,我修改了宏,将 sheet1 重命名为 RenameSheet1。当我从 IDE 运行我的项目时,它提示我 Excel SaveAs 窗口,需要我输入。我试图在我的代码 xlApp.ActiveWorkbook.SaveCopyAs(@"E:\data_extracts\RenameSheets21.xlsm");在关闭和退出之前。但是每次我运行该项目时,我都会不断收到 SaveAs 提示。我在这里错过了什么吗?谢谢。
    • 我很少使用 Excel,但如果我没记错的话,SaveAs 函数有一个重载,它采用布尔值来指定是否应该覆盖文件(如果存在)。当我在挖掘我的代码以查看是否正确时,您可以尝试一下。
    • 不。我的代码没有任何东西可以让我们覆盖现有的 Excel 文件。如果文件在保存之前存在,我确实有删除该文件的代码,所以这可能是我的解决方法,但它也可能取决于您尝试自动化的 Excel 的 vversion。在保存之前,您可以尝试做一些事情来确保文件名是唯一的。就像使用 System.Guid.NewId 并将文件命名为 System.Guid.NewId().ToString() + ".xls";如果你能摆脱它的提示,你应该是金色的。祝你好运!
    • 嗨,大卫,我使用带有正确参数的 SaveAs 来绕过之前看到的 SaveAs 提示。我的项目在 IDE 中运行良好。但是当我尝试从 SQL Job 运行它时,它由于同样的原因而失败(在我的第一篇文章中)。我不知道为什么从 SQL Job 运行它时会失败。请告诉我。谢谢。
    猜你喜欢
    • 2012-05-28
    • 2022-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多