EzAPI OLE DB Destination
本文关键字:Destination DB OLE EzAPI | 更新日期: 2023-09-27 18:33:37
我已经搜索了一遍,现在我必须问。我正在尝试使用 EzAPI 构建一个简单的数据流。这绝非易事,但我致力于解决这个问题。我无法弄清楚的是,如何让EzOleDBDestination
工作。这是我的完整代码
var a = new Application();
// using a template since it's impossible to set up an ADO.NET connection to MySQL
// using EzAPI and potentially even with the raw SSIS API...
var pkg = new EzPackage(a.LoadPackage(@"C:'...'Package.dtsx", null));
pkg.Name = "Star";
var df = new EzDataFlow(pkg);
df.Name = "My DataFlow";
var src = new EzAdoNetSource(df);
src.Name = "Source Database";
src.SqlCommand = "SELECT * FROM enum_institution";
src.AccessMode = AccessMode.AM_SQLCOMMAND;
src.Connection = new EzConnectionManager(pkg, pkg.Connections["SourceDB"]);
src.ReinitializeMetaData();
var derived = new EzDerivedColumn(df);
derived.AttachTo(src);
derived.Name = "Prepare Dimension Attributes";
derived.LinkAllInputsToOutputs();
derived.Expression["SourceNumber"] = "id";
derived.Expression["Name"] = "(DT_STR,255,1252)description";
// EDIT: reordered the operation here and I no longer get an error, but
// I'm not getting any mappings or any input columns when I open the package in the designer
var dest = new EzOleDbDestination(df);
dest.AttachTo(derived, 0, 0);
dest.Name = "Target Database";
dest.AccessMode = 0;
dest.Table = "[dbo].[DimInstitution]";
dest.Connection = new EzConnectionManager(pkg, pkg.Connections["TargetDB"]);
// this comes from Yahia's link
var destInput = dest.Meta.InputCollection[0];
var destVirInput = destInput.GetVirtualInput();
var destInputCols = destInput.InputColumnCollection;
var destExtCols = destInput.ExternalMetadataColumnCollection;
var sourceColumns = derived.Meta.OutputCollection[0].OutputColumnCollection;
foreach(IDTSOutputColumn100 outputCol in sourceColumns) {
// Now getting COM Exception here...
var extCol = destExtCols[outputCol.Name];
if(extCol != null) {
// Create an input column from an output col of previous component.
destVirInput.SetUsageType(outputCol.ID, DTSUsageType.UT_READONLY);
var inputCol = destInputCols.GetInputColumnByLineageID(outputCol.ID);
if(inputCol != null) {
// map the input column with an external metadata column
dest.Comp.MapInputColumn(destInput.ID, inputCol.ID, extCol.ID);
}
}
}
基本上,任何涉及调用ReinitializeMetadata()
的内容都会导致0xC0090001,因为该方法是发生错误的地方。没有真正的文档可以帮助我,所以我必须依靠这里的任何大师。
我应该提到源数据库是MySQL,目标数据库是SQL Server。使用 SSIS 设计器构建这样的包工作正常,所以我知道这是可能的。
如果我做错了什么,请随时告诉我。
编辑:这是我用作模板的基本包的链接:http://www.filedropper.com/package_1 .我已经编辑了连接细节,但任何MySQL和SQL Server数据库都可以。该包将从MySQL(使用MySQL ADO.NET 连接器(读取并写入SQL Server。
数据库架构大多无关紧要。为了进行测试,只需在MySQL中创建一个包含两列的表:id(int(和description(varchar(,id是主键。在 SQL Server 中创建等效的列。这里的目标只是从一个复制到另一个。它最终可能会在某个时候变得更加复杂,但我必须先克服这个障碍。
无法对此进行测试,但我相当确定以下内容将帮助您使其正常工作:
调用
ReinitializeMetadata()
会导致组件提取表元数据。只有在设置AccessMode
和相关属性后,才应调用此函数。您在设置AccessMode
之前调用它...各种示例,包括调试问题的建议
直接在 SQL 命令中定义派生列,而不是使用
EzDerivedColumn
首先尝试让它与 2 个 SQL Server 数据库一起工作,一些可用的 MySQL ADO.NET 提供程序在某些情况下存在一些缺点
更新 - 根据评论,有关调试此内容的更多信息以及指向带有源代码的完整端到端示例的链接:
- http://blogs.msdn.com/b/mattm/archive/2009/08/03/looking-up-ssis-hresult-comexception-errorcode.aspx
- http://blogs.msdn.com/b/mattm/archive/2009/08/03/debugging-a-comexception-during-package-generation.aspx
- 包含源的完整工作示例
我遇到了完全相同的问题,并且能够通过大量实验来解决它。简而言之,您必须为源和目标设置连接,然后在设置两个连接后调用 attachTo。必须为每个组件调用 attachTo。
我写了一篇关于从 SSIS 包作为模板开始,然后以编程方式对其进行操作以生成一组新包的博客。
本文进一步解释了这个问题。