SSIS包可以手动正常运行,但是会通过JOB

时间:2019-08-22 12:34:13

标签: sql-server ssis

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

问题
现在,当我从数据工具中运行该程序包时,它不会出现错误(将结果写入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连接,因此SO上有关此问题的最有效答案无济于事。

更多详细信息
整个主要过程都在脚本任务内部。在此任务中,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函数。
我认为上面的代码没有帮助,因为手动运行没有问题。另外,脚本任务没有变量。
任何帮助将不胜感激。

1 个答案:

答案 0 :(得分: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.这解决了我的问题。