我正在与 EZApi 合作,以协助创建一个包来暂存数据以进行转换。它在数据移动方面起作用。但是,在设计器中打开包时,派生列周围会出现警告消息,并且 InputColumns 被设置为只读。
警告 148 验证警告。暂存表名称:{AA700319-FC05-4F06-A877-599E826EA833}:“附加列”上的“附加列.输入[派生列输入].列[数据源ID]”的使用类型为只读,但未被表达式引用。从可用输入列列表中删除该列,或在表达式中引用它。StageFull.dtsx 0 0
我可以在设计器中手动将它们更改为读/写或取消选择它们,警告就会消失。但是,我无法让它以编程方式工作。
我已经尝试从有效但没有从组件中删除它们的元数据中删除列,因此这些列仍然在 xml 中创建。
XML 部分
<externalMetadataColumn refId="Package\Full\Staging TableName\DestinationStaging TableName.Inputs[OLE DB Destination Input].ExternalColumns[DataSourceID]" dataType="i4" name="DataSourceID" />
当我尝试转到基础对象并使用 component.DeleteInput(id) 删除列时,我收到一条错误消息,指出无法删除输入列。
0xC0208010
-1071611888
DTS_E_CANTDELETEINPUT
An input cannot be deleted from the inputs collection.
这是我用来创建具有 OLEDB 源、派生列和 OLE DB 目标的数据流任务的代码。
请注意,输入列在派生列附加到源之后才会出现:dc.AttachTo(source);
public class EzMyDataFlow : EzDataFlow
{
public EzMyDataFlow(EzContainer parent, EzSqlOleDbCM sourceconnection,
EzSqlOleDbCM destinationconnection, string destinationtable, string sourcecomannd, string dataflowname)
: base(parent)
{
Name = dataflowname;
EzOleDbSource source = new EzOleDbSource(this);
source.Connection = sourceconnection;
source.SqlCommand = sourcecomannd;
source.AccessMode = AccessMode.AM_SQLCOMMAND;
source.Name = string.Format("Source_{0}", dataflowname);
EzDerivedColumn dc = new EzDerivedColumn(this);
dc.Name = "Additional Columns";
// Setup DataSourceID
string columnName = DBSchema.ReportFoundationalColumns.DataSourceID;
dc.InsertOutputColumn(columnName);
dc.SetOutputColumnDataTypeProperties(columnName, DataType.DT_I4, 0, 0, 0, 0);
var c = dc.OutputCol(columnName);
var property = c.CustomPropertyCollection["Expression"];
property.Name = "Expression";
property.Value = "@[TM::SourceDatabaseID]";
property = c.CustomPropertyCollection["FriendlyExpression"];
property.Name = "FriendlyExpression";
property.Value = "@[TM::SourceDatabaseID]";
dc.AttachTo(source);
EzOleDbDestination destination = new EzOleDbDestination(this);
destination.Table = destinationtable;
destination.Connection = destinationconnection;
destination.Name = string.Format("Destination{0}", dataflowname);
destination.AttachTo(dc);
}
}