我已经搜遍了,我现在必须问问。我正在尝试使用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中创建等同的列。这里的目标仅仅是从一个复制到另一个。在某些时候它可能会变得更加复杂,但我必须首先通过这个障碍。
你能发布一个到你正在使用的包文件的链接,并告诉更多关于数据库模式的知识吗? – avs099
@ avs099问题已经被更新。 – siride
如果是这样,我会发布一个答案,但阅读代码,我相信它翻出来的原因是Connection属性没有设置,也不知道目标表是什么。我记得我在与ezapi项目合作时会遇到问题。看着我的代码,我也没有直接调用ReinitializeMetadata。如果你阻止了源代码,你会看到Ez组件用一些规律来调用它。看看我的代码[目标对象](http://stackoverflow.com/questions/8916674/what-is-the-ezapi-equivalent-for-using-an-ole-db-source-command-from-variable ) – billinkc