2012-05-07 46 views
2

我已经搜遍了,我现在必须问问。我正在尝试使用EzAPI构建一个简单的数据流。这一直很简单,但我致力于搞清楚这一点。我无法弄清楚的是如何让EzOleDBDestination工作。这里是我的完整代码EzAPI OLE DB目的地

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中创建等同的列。这里的目标仅仅是从一个复制到另一个。在某些时候它可能会变得更加复杂,但我必须首先通过这个障碍。

+0

你能发布一个到你正在使用的包文件的链接,并告诉更多关于数据库模式的知识吗? – avs099

+0

@ avs099问题已经被更新。 – siride

+0

如果是这样,我会发布一个答案,但阅读代码,我相信它翻出来的原因是Connection属性没有设置,也不知道目标表是什么。我记得我在与ezapi项目合作时会遇到问题。看着我的代码,我也没有直接调用ReinitializeMetadata。如果你阻止了源代码,你会看到Ez组件用一些规律来调用它。看看我的代码[目标对象](http://stackoverflow.com/questions/8916674/what-is-the-ezapi-equivalent-for-using-an-ole-db-source-command-from-variable ) – billinkc

回答

1

我现在不能测试这一点,但我宁愿相信下面将帮助你得到它的工作:

更新 - 按评论更多信息,调试这和一个链接到一个完整的端至端样品与源:

+0

我会稍微尝试前几件事,但我不认为你的最后一点是有效的。我可以用我在设计器(MySQL - > SQL Server,包括派生列)中手工构建的软件包来做这类事情。 – siride

+0

@siride写我取决于你使用哪个MySQL提供程序...有些比其他人更古怪...如果你使用一个稳定的,那么这是一件好事:-) – Yahia

+0

所以我尝试重新排序的东西一点如果我在设置连接之前设置了Table和AccessMode,那么我就不会出错。问题是,当我在SSIS设计器中打开目标时没有映射。使用链接中的示例,我再次得到COM异常,因为目标不认为它有任何输入列(请参阅我的更新代码)。 – siride