首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >EzAPI OLE DB目标

EzAPI OLE DB目标
EN

Stack Overflow用户
提问于 2012-05-08 05:10:59
回答 2查看 1.2K关注 0票数 3

我已经找遍了,现在我不得不这么问了。我正在尝试使用EzAPI构建一个简单的数据流。这绝非易事,但我将致力于解决这一问题。我搞不懂的是如何让EzOleDBDestination正常工作。下面是我的完整代码

代码语言:javascript
复制
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中创建等效列。这里的目标很简单,就是从一个复制到另一个。在某些情况下,它可能会变得更加复杂,但我必须首先克服这个障碍。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-05-11 02:21:50

我现在不能测试它,但我很确定下面的内容会帮助你让它工作:

在直接在SQL命令中设置派生列之前,您要调用它而不是首先使用EzDerivedColumn

  • try使其与2个SQL Server一起工作。在某些circumstances

下,一些可用的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
  • Complete working sample with source
票数 2
EN

Stack Overflow用户

发布于 2015-01-19 14:46:44

我遇到过完全相同的问题,并且能够通过大量的实验来解决它。简而言之,您必须同时为源和目标设置连接,然后在设置两个连接后调用attachTo。您必须为每个组件调用attachTo。

我写了一篇关于starting with an SSIS package as a template, and then manipulating it programmatically to produce a set of new packages的博客。

这篇文章对这个问题进行了更多的解释。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10489200

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档