2012-05-07 73 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