SSIS - 在脚本任务中使用对象变量(记录集):仅一次
SSIS - Use a Object variable (Recordset) in Script Task: only one time
我对 Recordset 和 Script Component 有一个奇怪的问题,所以我要解释一下情况。
在我的第一步中,我有一个数据流任务,我从 SQL 中读取一个 table 并将结果存储在记录集目标中,并将此记录集保存在一个变量中。
在我的第二步中,我有一个包含此组件的数据流任务:
- a - 我使用 File Flat Source 加载 .csv 文件
- b - 我用脚本组件修改数据
- c - 我使用 OLE DB 目标
将数据保存在 SQL 中
在步骤 b 中,我为每一行触发一个事件,并使用脚本任务在 ad EventHandler 中捕获该事件
此脚本任务中出现问题。这是代码:
public void Main()
{
...
string messaggio = GetMessaggio(connection, EventNumber);
...
}
private string GetMessaggio(string eventNumber)
{
using (var adapt = new OleDbDataAdapter())
using (var dt = new DataTable())
{
adapt.Fill(dt, Dts.Variables["User::RS_EventType"].Value);
return dt.AsEnumerable()
.Where(r => r.Field<int>("ev_number").ToString() == eventNumber)
.Select(r => r.Field<string>("ev_message"))
.FirstOrDefault() ?? "ND";
}
}
第一次,数据table 加载了正确的记录,但这只是第一次发生。
再次调用方法时,Dts.Variables["User::RS_EventType"].Value 似乎仍然有效,但 adapt.Fill 不填充数据 table.
可能是什么问题?
我找到了阅读这篇文章的解决方案 post:SSIS Script Task - Reading RecordSet object in a loop is failing
现在这是代码:
private string GetMessaggio(string eventNumber)
{
using (var adapt = new OleDbDataAdapter())
using (var dt = new DataTable())
{
var stm = new ADODB.Stream();
var rsCopy = new ADODB.Recordset();
var rs = ((ADODB.Recordset)Dts.Variables["User::RS_EventType"].Value).Clone();
rs.Save(stm);
rsCopy.Open(stm);
adapt.Fill(dt, rsCopy);
rs.Close();
stm.Close();
rsCopy.Close();
Marshal.ReleaseComObject(stm);
Marshal.ReleaseComObject(rsCopy);
Marshal.ReleaseComObject(rs);
return dt.AsEnumerable()
.Where(r => r.Field<int>("ev_number").ToString() == eventNumber)
.Select(r => r.Field<string>("ev_message"))
.FirstOrDefault() ?? "ND";
}
}
我对 Recordset 和 Script Component 有一个奇怪的问题,所以我要解释一下情况。
在我的第一步中,我有一个数据流任务,我从 SQL 中读取一个 table 并将结果存储在记录集目标中,并将此记录集保存在一个变量中。
在我的第二步中,我有一个包含此组件的数据流任务:
- a - 我使用 File Flat Source 加载 .csv 文件
- b - 我用脚本组件修改数据
- c - 我使用 OLE DB 目标 将数据保存在 SQL 中
在步骤 b 中,我为每一行触发一个事件,并使用脚本任务在 ad EventHandler 中捕获该事件 此脚本任务中出现问题。这是代码:
public void Main()
{
...
string messaggio = GetMessaggio(connection, EventNumber);
...
}
private string GetMessaggio(string eventNumber)
{
using (var adapt = new OleDbDataAdapter())
using (var dt = new DataTable())
{
adapt.Fill(dt, Dts.Variables["User::RS_EventType"].Value);
return dt.AsEnumerable()
.Where(r => r.Field<int>("ev_number").ToString() == eventNumber)
.Select(r => r.Field<string>("ev_message"))
.FirstOrDefault() ?? "ND";
}
}
第一次,数据table 加载了正确的记录,但这只是第一次发生。 再次调用方法时,Dts.Variables["User::RS_EventType"].Value 似乎仍然有效,但 adapt.Fill 不填充数据 table.
可能是什么问题?
我找到了阅读这篇文章的解决方案 post:SSIS Script Task - Reading RecordSet object in a loop is failing
现在这是代码:
private string GetMessaggio(string eventNumber)
{
using (var adapt = new OleDbDataAdapter())
using (var dt = new DataTable())
{
var stm = new ADODB.Stream();
var rsCopy = new ADODB.Recordset();
var rs = ((ADODB.Recordset)Dts.Variables["User::RS_EventType"].Value).Clone();
rs.Save(stm);
rsCopy.Open(stm);
adapt.Fill(dt, rsCopy);
rs.Close();
stm.Close();
rsCopy.Close();
Marshal.ReleaseComObject(stm);
Marshal.ReleaseComObject(rsCopy);
Marshal.ReleaseComObject(rs);
return dt.AsEnumerable()
.Where(r => r.Field<int>("ev_number").ToString() == eventNumber)
.Select(r => r.Field<string>("ev_message"))
.FirstOrDefault() ?? "ND";
}
}