【发布时间】: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