简体   繁体   English

SSIS脚本任务错误消息

[英]SSIS script task error message

I received the following error message when running SSIS package. 运行SSIS包时,我收到以下错误消息。 The Script Task is using Microsoft Visual C# 2008 . 脚本任务正在​​使用Microsoft Visual C# 2008 Can you please help me to fix the problem? 您能帮我解决问题吗?

Thank you very much! 非常感谢你! I also attach error message: 我还附上错误消息:

Error: 2015-12-22 02:58:08.28
   Code: 0x00000001
   Source: Script Task 
   Description: System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation. ---> System.InvalidOperationException: Showing a modal dialog box or form when the application is not running in UserInteractive mode is not a valid operation. Specify the ServiceNotification or DefaultDesktopOnly style to display a notification from a service application.
   at System.Windows.Forms.MessageBox.ShowCore(IWin32Window owner, String text, String caption, MessageBoxButtons buttons, MessageBoxIcon icon, MessageBoxDefaultButton defaultButton, MessageBoxOptions options, Boolean showHelp)
   at System.Windows.Forms.MessageBox.Show(String text)
   at ST_d27b216cd7d64713b54c81f6ac28d805.csproj.ScriptMain.Main()
   --- End of inner exception stack trace ---
   at System.RuntimeMethodHandle._InvokeMethodFast(Object target, Object[] arguments, SignatureStruct& sig, MethodAttributes methodAttributes, RuntimeTypeHandle typeOwner)
   at System.RuntimeMethodHandle.InvokeMethodFast(Object target, Object[] arguments, Signature sig, MethodAttributes methodAttributes, RuntimeTypeHandle typeOwner)
   at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture, Boolean skipVisibilityChecks)
   at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
   at System.RuntimeType.InvokeMember(String name, BindingFlags bindingFlags, Binder binder, Object target, Object[] providedArgs, ParameterModifier[] modifiers, CultureInfo culture, String[] namedParams)
   at System.Type.InvokeMember(String name, BindingFlags invokeAttr, Binder binder, Object target, Object[] args, CultureInfo culture)
   at Microsoft.SqlServer.Dts.Tasks.ScriptTask.VSTATaskScriptingEngine.ExecuteScript()
End Error
DTExec: The package execution returned DTSER_FAILURE (1).

C# code: C#代码:

using System;
using System.Data;
using Microsoft.SqlServer.Dts.Runtime;
using System.Windows.Forms;

namespace ST_d27b216cd7d64713b54c81f6ac28d805.csproj
{
    [System.AddIn.AddIn("ScriptMain", Version = "1.0", Publisher = "", Description = "")]
    public partial class ScriptMain : Microsoft.SqlServer.Dts.Tasks.ScriptTask.VSTARTScriptObjectModelBase
    {

        #region VSTA generated code
        enum ScriptResults
        {
            Success = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Success,
            Failure = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Failure
        };
        #endregion

        public void Main()
        {
            // TODO: Add your code here
            System.IO.FileInfo fi;
            String FilePath = null;

            DateTime ModifiedTime = (DateTime)Dts.Variables["File_Modified"].Value;


            DateTime LoadDate = (DateTime)Dts.Variables["File_Last_Load_Date"].Value;

            Dts.Variables["isModified"].Value = false;


            FilePath = Dts.Variables["SourceFolder"].Value.ToString();
            ModifiedTime = System.IO.File.GetLastWriteTime(FilePath);

            Dts.Variables["File_Modified"].Value = ModifiedTime; 
            // fi.LastWriteTime;
            int result = DateTime.Compare(ModifiedTime, LoadDate);

            if (result > 0)
            {
                  MessageBox.Show("File Modified after last load in staging");
                Dts.Variables["isModified"].Value = true;
            }
            else
            {
               MessageBox.Show("file is not modified since last load");
                Dts.Variables["isModified"].Value = false;
            }

            Dts.TaskResult = (int)ScriptResults.Success;
        }
    }
}

The error is raised because your script task is trying to display a message box and showing a modal dialog box or form when the application is not running in UserInteractive mode is not a valid operation. 引发错误是因为您的脚本任务试图在应用程序不在UserInteractive模式下运行时试图显示消息框并显示模式对话框或窗体不是有效操作。 Therefore if you want to output a message, you could use Dts.Log instead, see the MSDN documentation for further details. 因此,如果要输出消息,可以改用Dts.Log ,请参阅MSDN文档以获取更多详细信息。

The error message extracted from your stack trace is: 从堆栈跟踪中提取的错误消息是:

Showing a modal dialog box or form when the application is not running in UserInteractive mode is not a valid operation. 当应用程序不在UserInteractive模式下运行时,显示模式对话框或窗体是无效操作。 Specify the ServiceNotification or DefaultDesktopOnly style to display a notification from a service application. 指定ServiceNotification或DefaultDesktopOnly样式以显示来自服务应用程序的通知。

You have to remember that although when you are debugging your SSIS package you have a nice UI (BIDS or SQL Server Tools shells depending on your environment) but really it is not designed to be have a UI. 您必须记住,尽管在调试SSIS软件包时,您有一个不错的UI(BIDS或SQL Server Tools Shells取决于您的环境),但实际上它并不是设计成具有UI的。 What would you expect to happen when this package is deployed to a server and called by a SQL Job? 当此程序包部署到服务器并由SQL Job调用时,您会期望发生什么? ie Where would the message box show? 即消息框将显示在哪里? Who would click "OK" to allow the thread to resume? 谁将单击“确定”以允许线程恢复?

You probably want to just fire an information event if you are looking to post feedback, something like: 如果您希望发布反馈,则可能只想触发一个信息事件 ,例如:

bool fireAgain = false;
Dts.Events.FireInformation(0, "Script Task", "File Modified after last load in staging", String.Empty, 0, ref fireAgain);

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM