【问题标题】:SSIS package runs fine manually but throws error via JOBSSIS 包手动运行良好,但通过 JOB 抛出错误
【发布时间】:2019-08-22 12:34:13
【问题描述】:

SSIS 包信息
我有一个包,它操作一些数据(从 API 接收),将其写入 SQL Server 表并将其转换为 ADODB 记录集以将其远程发送到 SAP。该包没有 SQL 或文件连接(我正在通过 c# 脚本连接并写入数据库)。

问题
现在,当我从 Data Tools 运行这个包时,它可以正常运行(将结果写入 SQL 数据库表并将其发送到 SAP)。当我将它部署到 SQL Server 并将其分配给作业并运行它时,它会失败。
错误是: The Execute method for the task has the error code 0x80004003 (The value can not be NULL. Parameter name: adodb) returned.
包一直运行到将数据成功写入 SQL 表的步骤。错误是当它尝试使用 ADODB Recordset 将数据远程发送到 SAP 时,它显然发现它为空。

到目前为止我尝试了什么
我尝试过重新构建并部署它。它没有效果。
我还更改了项目的保护级别,对此也没有影响。
由于我没有 SQL 连接,所以关于这个问题的最可用答案无济于事。

更多详情
整个主要过程都在一个脚本任务中。在这个任务中,API 的结果被写入 SQL 表:

            string SqlQuery= "INSERT INTO xxx (xx, xx)" +
                                    "VALUES(" +
                                    "'" + val1 + "'," +
                                    "'" + val2 + "')";
            try
            {
                SqlConnection con = new SqlConnection(
                                 "Data Source=xxx;Initial Catalog=xxx;User ID=xx;Password=xx");
                con.Open();

                SqlCommand cmd = new SqlCommand(SqlQuery, con);
                cmd.ExecuteNonQuery();
                con.Close();
            }
            catch (Exception e)
            {

            }


在此之后,值 (val1, val2) 被转换为记录集:

            ADODB.Recordset result = new ADODB.Recordset();
            ADODB.Fields resultFields = result.Fields;

            resultFields.Append("VAL1_LINE",
                                ADODB.DataTypeEnum.adVarChar,
                                255,
                                ADODB.FieldAttributeEnum.adFldIsNullable,
                                null);

            result.Open(System.Reflection.Missing.Value
                    , System.Reflection.Missing.Value
                    , ADODB.CursorTypeEnum.adOpenStatic
                    , ADODB.LockTypeEnum.adLockOptimistic, 0);


            foreach (string row in stringVar.Split('\n'))
            {
                result.AddNew(System.Reflection.Missing.Value,
                              System.Reflection.Missing.Value);
                resultFields[0].Value = Regex.Replace(row, @"\t", "");
            }

在此之后,记录集被发送到 SAP 的 RFC 函数。
我认为上面的代码没有帮助,因为代码手动运行没有问题。此外,脚本任务没有变量。
任何帮助将不胜感激。

【问题讨论】:

  • 如果您能提供有关参数的屏幕截图或详细信息、如何创建以及如何将其传递给脚本任务,将会很有帮助。
  • @JoeC 按要求添加。有帮助吗?
  • 包中哪里有一个名为adodb的参数?我在您的任何代码或描述中都没有看到它?
  • @TabAlleman 是的,根本没有这样的参数。我认为错误意味着 ADODB 对象变量为空。但我只是假设这一点。我可以确认没有什么叫做 ADODB,因为我是从头开始开发这个包的。
  • 你是如何将包部署到服务器的(文件系统,ssisdb?)。在我多年使用 SSIS 的经验中 - 如果它在 Visual Studio/Data Tools 中运行良好,但在作为作业运行时抛出错误,它几乎总是基于权限的。还有,什么版本的 Visual Studio/Data Tools,什么版本的 SQL Server?

标签: sql-server ssis


【解决方案1】:

我可以通过这种方式找到错误:

    string text = e.Message.ToString(); 
    string path = @"path\logFile.txt";
    System.IO.File.AppendAllText(path, text);


我在所有的try&catch中添加了上面的代码,发现错误是'ADODB.FieldsToInternalFieldsMarshaler' in the assembly yxz could not be loaded.
这让我找到了SO Link
我所做的只是:Scipt Task > References > adodb > Right click and click properties > Embed Interop Types > False. 这解决了我的问题。

【讨论】:

    猜你喜欢
    • 2014-01-02
    • 2022-06-16
    • 1970-01-01
    • 2013-07-01
    • 2011-01-14
    • 1970-01-01
    • 1970-01-01
    • 2017-11-08
    相关资源
    最近更新 更多