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函数。
我认为上面的代码没有帮助,因为手动运行没有问题。另外,脚本任务没有变量。
任何帮助将不胜感激。
答案 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.
这解决了我的问题。