Dictionary<int, string> derivedLineageIdentifiers = new Dictionary<int, string>();
string filepath = dbfFile.Remove(dbfFile.LastIndexOf(@"\"));
//set up the package
package = new Package();
//creates and executable (which translates to a dataflowtask in SSIS)
Executable exec = package.Executables.Add("STOCK:PipelineTask");
TaskHost taskHost = exec as TaskHost;
MainPipe dataFlowTask = taskHost.InnerObject as MainPipe;
/* ############################################ */
/* ADD THE VFP SOURCE COMPONENT TO THE DATAFLOW */
/* ############################################ */
//Creates the connection to the FoxPro dbf file
ConnectionManager cm = package.Connections.Add("OLEDB");
cm.Name = "FoxPro Connection Manager";
cm.ConnectionString = "Data Source=" + filepath + ";Provider=VFPOLEDB.1;Extended Properties=dBase 5.0;Collating Sequence=MACHINE;";//@"Provider=VFPOLEDB.1; DataSource=" + filepath + ";Extended Properties=dBase 5.0; Collating Sequence=general";
//Creates the source component and instantiates it
IDTSComponentMetaData90 sourceDataFlowComponent = dataFlowTask.ComponentMetaDataCollection.New();
sourceDataFlowComponent.Name = "Visual Fox Pro DBF Source";
sourceDataFlowComponent.ComponentClassID = "{2C0A8BE5-1EDC-4353-A0EF-B778599C65A0}";
CManagedComponentWrapper instance = sourceDataFlowComponent.Instantiate();
instance.ProvideComponentProperties();
//Specifies the connection manager
if (sourceDataFlowComponent.RuntimeConnectionCollection.Count > 0)
{
sourceDataFlowComponent.RuntimeConnectionCollection[0].ConnectionManager = DtsConvert.ToConnectionManager90(package.Connections[0]);
sourceDataFlowComponent.RuntimeConnectionCollection[0].ConnectionManagerID = package.Connections[0].ID;
}
//Set custom properties
instance.SetComponentProperty("AccessMode", 2);
instance.SetComponentProperty("SqlCommand", "select * from '" + dbfFile + "'");
instance.SetComponentProperty("DefaultCodePage", 1252);
instance.SetComponentProperty("AlwaysUseDefaultCodePage", false);
instance.SetComponentProperty("CommandTimeout", 0);
//Reinitialize the metadata (not sure this is required - will test)
instance.AcquireConnections(null);
instance.ReinitializeMetaData();
//Initialize and output Column
IDTSExternalMetadataColumn90 exOutColumn;
foreach (IDTSOutputColumn90 outColumn in sourceDataFlowComponent.OutputCollection[0].OutputColumnCollection)
{
exOutColumn = sourceDataFlowComponent.OutputCollection[0].ExternalMetadataColumnCollection[outColumn.Name];
instance.MapOutputColumn(sourceDataFlowComponent.OutputCollection[0].ID, outColumn.ID, exOutColumn.ID, true);
}
instance.ReleaseConnections();
/* ############################################ */
/* ADD TRANSFORMATION COMPONENT TO THE DATAFLOW */
/* ############################################ */
//Creates and configures the transformation component
IDTSComponentMetaData90 transformationDataFlowComponent = dataFlowTask.ComponentMetaDataCollection.New();
transformationDataFlowComponent.Name = "Derived Column Component";
//transformationDataFlowComponent.ComponentClassID = "DTSTransform.DataConvert.1";
transformationDataFlowComponent.ComponentClassID = "{9CF90BF0-5BCC-4C63-B91D-1F322DC12C26}";
CManagedComponentWrapper transformationInstance = transformationDataFlowComponent.Instantiate();
transformationInstance.ProvideComponentProperties();
transformationDataFlowComponent.InputCollection[0].ExternalMetadataColumnCollection.IsUsed = false;
transformationDataFlowComponent.InputCollection[0].HasSideEffects = false;
//Create the path from source to transformation
IDTSPath90 fPath = dataFlowTask.PathCollection.New();
fPath.AttachPathAndPropagateNotifications(sourceDataFlowComponent.OutputCollection[0], transformationDataFlowComponent.InputCollection[0]);
transformationInstance.AcquireConnections(null);
transformationInstance.ReinitializeMetaData();
//Get the output collection
IDTSOutput90 output = transformationDataFlowComponent.OutputCollection[0];
//Create the input columns for the transformation component
IDTSInput90 input;
IDTSVirtualInput90 vInput;
//Get the destinations default input and virtual input
input = transformationDataFlowComponent.InputCollection[0];
vInput = input.GetVirtualInput();
//Iterate through the virtual input column collection
foreach (IDTSVirtualInputColumn90 vColumn in vInput.VirtualInputColumnCollection)
{
IDTSInputColumn90 inputColumn = transformationInstance.SetUsageType(input.ID, vInput, vColumn.LineageID, DTSUsageType.UT_READONLY);
//propogate to output column collection.
//IDTSOutputColumn90 outputColumn = transformationInstance.InsertOutputColumnAt(output.ID, output.OutputColumnCollection.Count, vColumn.Name, "Sql server compatible conversion column");
IDTSOutputColumn90 outputColumn;
IDTSCustomProperty90 property;
/* for all the columns, search for the ones which are from the converted output collection
* then iterate through all these adding the derived column outputs while placing the IDs into
* a new derivedColumnLineageID collection
*/
switch (inputColumn.Name.ToUpper())
{
case "GROUP":
//for each new column remember to set new column name
outputColumn = transformationDataFlowComponent.OutputCollection[0].OutputColumnCollection.New();
outputColumn.SetDataTypeProperties(Microsoft.SqlServer.Dts.Runtime.Wrapper.DataType.DT_WSTR, 1, inputColumn.Precision, inputColumn.Scale, 0);
outputColumn.Name = "status";
outputColumn.ExternalMetadataColumnID = 0;
property = outputColumn.CustomPropertyCollection.New();
property.Name = "Expression";
property.Value = "[SUBSTRING](#" + inputColumn.LineageID + ",5,1)";
property = outputColumn.CustomPropertyCollection.New();
property.Name = "FriendlyExpression";
property.Value = "SUBSTRING(GROUP,5,1)";
derivedLineageIdentifiers[outputColumn.LineageID] = outputColumn.Name;
//for each new column remember to set new column name
outputColumn = transformationDataFlowComponent.OutputCollection[0].OutputColumnCollection.New();
outputColumn.SetDataTypeProperties(Microsoft.SqlServer.Dts.Runtime.Wrapper.DataType.DT_I4, 0, 0, 0, 0);
outputColumn.Name = "class";
outputColumn.ExternalMetadataColumnID = 0;
property = outputColumn.CustomPropertyCollection.New();
property.Name = "Expression";
property.Value = "(DT_I4)[SUBSTRING](#" + inputColumn.LineageID + ",9,[FINDSTRING]([RIGHT](#" + inputColumn.LineageID + ",[LEN](#" + inputColumn.LineageID + ") - 9),\"_\",1))";
property = outputColumn.CustomPropertyCollection.New();
property.Name = "FriendlyExpression";
property.Value = "(DT_I4)SUBSTRING(GROUP,9,FINDSTRING(RIGHT(GROUP,LEN(GROUP) - 9),\"_\",1))";
derivedLineageIdentifiers[outputColumn.LineageID] = outputColumn.Name;
//for each new column remember to set new column name
outputColumn = transformationDataFlowComponent.OutputCollection[0].OutputColumnCollection.New();
outputColumn.SetDataTypeProperties(Microsoft.SqlServer.Dts.Runtime.Wrapper.DataType.DT_WSTR, inputColumn.Length, inputColumn.Precision, inputColumn.Scale, 0);
outputColumn.Name = "employer";
outputColumn.ExternalMetadataColumnID = 0;
property = outputColumn.CustomPropertyCollection.New();
property.Name = "Expression";
property.Value = "[FINDSTRING](#" + inputColumn.LineageID + ",\"_ER\",1) == 0 ? NULL(DT_WSTR,50) : [SUBSTRING](#" + inputColumn.LineageID + ",[FINDSTRING](#" + inputColumn.LineageID + ",\"_ER\",1) + 3,[FINDSTRING]([RIGHT](#" + inputColumn.LineageID + ",[LEN](#" + inputColumn.LineageID + ") - ([FINDSTRING](#" + inputColumn.LineageID + ",\"_ER\",1) + 3)),\"_\",1))";
property = outputColumn.CustomPropertyCollection.New();
property.Name = "FriendlyExpression";
property.Value = "FINDSTRING(GROUP,\"_ER\",1) == 0 ? NULL(DT_WSTR,50) : SUBSTRING(GROUP,FINDSTRING(GROUP,\"_ER\",1) + 3,FINDSTRING(RIGHT(GROUP,LEN(GROUP) - (FINDSTRING(GROUP,\"_ER\",1) + 3)),\"_\",1))";
derivedLineageIdentifiers[outputColumn.LineageID] = outputColumn.Name;
//for each new column remember to set new column name
outputColumn = transformationDataFlowComponent.OutputCollection[0].OutputColumnCollection.New();
outputColumn.SetDataTypeProperties(Microsoft.SqlServer.Dts.Runtime.Wrapper.DataType.DT_I4, 0, 0, 0, 0);
outputColumn.Name = "age";
outputColumn.ExternalMetadataColumnID = 0;
property = outputColumn.CustomPropertyCollection.New();
property.Name = "Expression";
property.Value = "[FINDSTRING](#" + inputColumn.LineageID + ",\"_AG\",1) == 0 ? NULL(DT_I4) : (DT_I4)[SUBSTRING](#" + inputColumn.LineageID + ",[FINDSTRING](#" + inputColumn.LineageID + ",\"_AG\",1) + 3,[FINDSTRING]([RIGHT](#" + inputColumn.LineageID + ",[LEN](#" + inputColumn.LineageID + ") - ([FINDSTRING](#" + inputColumn.LineageID + ",\"_AG\",1) + 3)),\"_\",1))";
property = outputColumn.CustomPropertyCollection.New();
property.Name = "FriendlyExpression";
property.Value = "FINDSTRING(GROUP,\"_AG\",1) == 0 ? NULL(DT_I4) : (DT_I4)SUBSTRING(GROUP,FINDSTRING(GROUP,\"_AG\",1) + 3,FINDSTRING(RIGHT(GROUP,LEN(GROUP) - (FINDSTRING(GROUP,\"_AG\",1) + 3)),\"_\",1))";
derivedLineageIdentifiers[outputColumn.LineageID] = outputColumn.Name;
//for each new column remember to set new column name
outputColumn = transformationDataFlowComponent.OutputCollection[0].OutputColumnCollection.New();
outputColumn.SetDataTypeProperties(Microsoft.SqlServer.Dts.Runtime.Wrapper.DataType.DT_I4, 0, 0, 0, 0);
outputColumn.Name = "individual";
outputColumn.ExternalMetadataColumnID = 0;
property = outputColumn.CustomPropertyCollection.New();
property.Name = "Expression";
property.Value = "[FINDSTRING](#25124,\"_\",3 + ([FINDSTRING](#" + inputColumn.LineageID + ",\"_ER\",1) == 0 ? 0 : 1) + ([FINDSTRING](#" + inputColumn.LineageID + ",\"_AG\",1) == 0 ? 0 : 1)) == 0 ? NULL(DT_I4) : (DT_I4)[SUBSTRING](#" + inputColumn.LineageID + ",1 + [FINDSTRING](#25124,\"_\",2 + ([FINDSTRING](#25124,\"_ER\",1) == 0 ? 0 : 1) + ([FINDSTRING](#" + inputColumn.LineageID + ",\"_AG\",1) == 0 ? 0 : 1)),-1 + [FINDSTRING](#25124,\"_\",3 + ([FINDSTRING](#" + inputColumn.LineageID + ",\"_ER\",1) == 0 ? 0 : 1) + ([FINDSTRING](#" + inputColumn.LineageID + ",\"_AG\",1) == 0 ? 0 : 1)) - [FINDSTRING](#" + inputColumn.LineageID + ",\"_\",2 + ([FINDSTRING](#" + inputColumn.LineageID + ",\"_ER\",1) == 0 ? 0 : 1) + ([FINDSTRING](#" + inputColumn.LineageID + ",\"_AG\",1) == 0 ? 0 : 1)))";
property = outputColumn.CustomPropertyCollection.New();
property.Name = "FriendlyExpression";
property.Value = "FINDSTRING(GROUP,\"_\",3 + (FINDSTRING(GROUP,\"_ER\",1) == 0 ? 0 : 1) + (FINDSTRING(GROUP,\"_AG\",1) == 0 ? 0 : 1)) == 0 ? NULL(DT_I4) : (DT_I4)SUBSTRING(GROUP,1 + FINDSTRING(GROUP,\"_\",2 + (FINDSTRING(GROUP,\"_ER\",1) == 0 ? 0 : 1) + (FINDSTRING(GROUP,\"_AG\",1) == 0 ? 0 : 1)),-1 + FINDSTRING(GROUP,\"_\",3 + (FINDSTRING(GROUP,\"_ER\",1) == 0 ? 0 : 1) + (FINDSTRING(GROUP,\"_AG\",1) == 0 ? 0 : 1)) - FINDSTRING(GROUP,\"_\",2 + (FINDSTRING(GROUP,\"_ER\",1) == 0 ? 0 : 1) + (FINDSTRING(GROUP,\"_AG\",1) == 0 ? 0 : 1)))";
derivedLineageIdentifiers[outputColumn.LineageID] = outputColumn.Name;
break;
case "PERIOD":
outputColumn = transformationDataFlowComponent.OutputCollection[0].OutputColumnCollection.New();
outputColumn.SetDataTypeProperties(Microsoft.SqlServer.Dts.Runtime.Wrapper.DataType.DT_I4, 0, 0, 0, 0);
outputColumn.Name = "year";
outputColumn.ExternalMetadataColumnID = 0;
property = outputColumn.CustomPropertyCollection.New();
property.Name = "Expression";
property.Value = "(DT_I4)[RIGHT](#" + inputColumn.LineageID + ",[LEN](#" + inputColumn.LineageID + ") - 4)";
property = outputColumn.CustomPropertyCollection.New();
property.Name = "FriendlyExpression";
property.Value = "(DT_I4)RIGHT(PERIOD,LEN(PERIOD) - 4)";
derivedLineageIdentifiers[outputColumn.LineageID] = outputColumn.Name;
break;
case "TRAN_ORIG":
outputColumn = transformationDataFlowComponent.OutputCollection[0].OutputColumnCollection.New();
outputColumn.SetDataTypeProperties(Microsoft.SqlServer.Dts.Runtime.Wrapper.DataType.DT_I4, 0, 0, 0, 0);
outputColumn.Name = "tranche";
outputColumn.ExternalMetadataColumnID = 0;
property = outputColumn.CustomPropertyCollection.New();
property.Name = "Expression";
property.Value = "#" + inputColumn.LineageID;
property = outputColumn.CustomPropertyCollection.New();
property.Name = "FriendlyExpression";
property.Value = "TRAN_ORIG";
derivedLineageIdentifiers[outputColumn.LineageID] = outputColumn.Name;
break;
//USE THESE CASES TO REMOVE THESE COLUMNS FROM THE OUTPUT
case "PRODUCT":
break;
case "PURPOSE":
break;
case "DISC_RATE":
break;
case "TIME":
break;
case "T_FROM":
break;
case "T_TO":
break;
case "INPUT_VAR":
break;
default:
outputColumn = transformationInstance.InsertOutputColumnAt(output.ID, output.OutputColumnCollection.Count, inputColumn.Name, "standard column");
outputColumn.ExternalMetadataColumnID = 0;
derivedLineageIdentifiers[outputColumn.LineageID] = outputColumn.Name;
break;
}
}
transformationInstance.ReleaseConnections();
/* ########################################### */
/* NOW ADD OUR THIRD COMPONENT TO THE DATAFLOW */
/* ########################################### */
//Creates the SQL destination connection
ConnectionManager cm2 = package.Connections.Add("OLEDB");
cm2.Name = "MS SQL Server 2005 Exodus Cash Flows DB";
cm2.ConnectionString = @"Provider=SQLNCLI.1;Data Source=HRGLADEV07;Initial Catalog=ExodusCashFlow;Integrated Security=SSPI;Auto Translate=false;";
//Creates the SQL destination component and instantiates it
IDTSComponentMetaData90 destination = dataFlowTask.ComponentMetaDataCollection.New();
destination.Name = "SQL Server Destination";
destination.ComponentClassID = "{E2568105-9550-4F71-A638-B7FE42E66922}";
CManagedComponentWrapper destDesignTime = destination.Instantiate();
destDesignTime.ProvideComponentProperties();
//Specify the connection manager for the component
if (destination.RuntimeConnectionCollection.Count > 0)
{
destination.RuntimeConnectionCollection[0].ConnectionManager = DtsConvert.ToConnectionManager90(package.Connections[1]);
destination.RuntimeConnectionCollection[0].ConnectionManagerID = package.Connections[1].ID;
}
//Set custom properties
destDesignTime.SetComponentProperty("AccessMode", 3);
destDesignTime.SetComponentProperty("OpenRowset", "[ExodusCashFlow].[dbo].[Cashflow]");
destDesignTime.SetComponentProperty("FastLoadOptions", "TABLOCK");
destDesignTime.SetComponentProperty("DefaultCodePage", 1252);
destDesignTime.SetComponentProperty("AlwaysUseDefaultCodePage", false);
//Create the path from transformation to destination
IDTSPath90 path = dataFlowTask.PathCollection.New();
//Get the output collection of one component and send it to another
path.AttachPathAndPropagateNotifications(transformationDataFlowComponent.OutputCollection[0],
destination.InputCollection[0]);
destDesignTime.AcquireConnections(null);
destDesignTime.ReinitializeMetaData();
input = destination.InputCollection[0];
vInput = input.GetVirtualInput();
foreach (IDTSVirtualInputColumn90 vColumn in vInput.VirtualInputColumnCollection)
{
if (derivedLineageIdentifiers.ContainsKey(vColumn.LineageID))
{
destDesignTime.SetUsageType(input.ID, vInput, vColumn.LineageID, DTSUsageType.UT_READONLY);
}
}
IDTSExternalMetadataColumn90 exColumn;
foreach (IDTSInputColumn90 inColumn in destination.InputCollection[0].InputColumnCollection)
{
exColumn = destination.InputCollection[0].ExternalMetadataColumnCollection[inColumn.Name.ToUpper()];
destDesignTime.MapInputColumn(destination.InputCollection[0].ID, inColumn.ID, exColumn.ID);
}
destDesignTime.ReleaseConnections();
ErrorEvents errors = new ErrorEvents();
Logging log = new Logging();
package.Validate(null, null, errors, null);
long start = DateTime.Now.Ticks;
DTSExecResult result = package.Execute(null, null, errors, null, null);
long end = DateTime.Now.Ticks;
lblResult.Text = result.ToString() + " TIME TAKEN: " + TimeSpan.FromTicks(end - start).TotalSeconds.ToString();
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
129:
130:
131:
132:
133:
134:
135:
136:
137:
138:
139:
140:
141:
142:
143:
144:
145:
146:
147:
148:
149:
150:
151:
152:
153:
154:
155:
156:
157:
158:
159:
160:
161:
162:
163:
164:
165:
166:
167:
168:
169:
170:
171:
172:
173:
174:
175:
176:
177:
178:
179:
180:
181:
182:
183:
184:
185:
186:
187:
188:
189:
190:
191:
192:
193:
194:
195:
196:
197:
198:
199:
200:
201:
202:
203:
204:
205:
206:
207:
208:
209:
210:
211:
212:
213:
214:
215:
216:
217:
218:
219:
220:
221:
222:
223:
224:
225:
226:
227:
228:
229:
230:
231:
232:
233:
234:
235:
236:
237:
238:
239:
240:
241:
242:
243:
244:
245:
246:
247:
248:
249:
250:
251:
252:
253:
254:
255:
256:
257:
258:
259:
260:
261:
262:
263:
264:
265:
266:
267:
268:
269:
270:
271:
272:
273:
274:
275:
276:
277:
278:
279:
by: BrettneyPosted on 2008-12-10 at 04:25:55ID: 23138167
Not all the code came through, the rest is here:
e.ReleaseC onnections ();
########## ####### */ ########## ####### */
LEDB"); egrated Security=SSPI;Auto Translate=false;";
DataCollec tion.New() ; ID = "{E2568105-9550-4F71-A638- B7FE42E669 22}"; onentPrope rties();
tionCollec tion.Count > 0) ionCollect ion[0].Con nectionMan ager = DtsConvert.ToConnectionMan ager90(pac kage.Conne ctions[1]) ; ionCollect ion[0].Con nectionMan agerID = package.Connections[1].ID;
tProperty( "AccessMod e", 3); tProperty( "OpenRowse t", "[ExodusCashFlow].[dbo].[C ashflow]") ; tProperty( "FastLoadO ptions", "TABLOCK"); tProperty( "DefaultCo dePage", 1252); tProperty( "AlwaysUse DefaultCod ePage", false);
n.New(); eNotificat ions(trans formationD ataFlowCom ponent.Out putCollect ion[0], n[0]); ections(nu ll); eMetaData( );
n[0];
ollection) .ContainsK ey(vColumn .LineageID )) e(input.ID , vInput, vColumn.LineageID, DTSUsageType.UT_READONLY);
90 exColumn; n[0].Input ColumnColl ection) n[0].Exter nalMetadat aColumnCol lection[in Column.Nam e.ToUpper( )]; umn(destin ation.Inpu tCollectio n[0].ID, inColumn.ID, exColumn.ID); ections();
ng();
transformationInstanc
/* ##########################
/* NOW ADD OUR THIRD COMPONENT TO THE DATAFLOW */
/* ##########################
//Creates the SQL destination connection
ConnectionManager cm2 = package.Connections.Add("O
cm2.Name = "MS SQL Server 2005 Exodus Cash Flows DB";
cm2.ConnectionString = @"Provider=SQLNCLI.1;Data Source=HRGLADEV07;Initial Catalog=ExodusCashFlow;Int
//Creates the SQL destination component and instantiates it
IDTSComponentMetaData90 destination = dataFlowTask.ComponentMeta
destination.Name = "SQL Server Destination";
destination.ComponentClass
CManagedComponentWrapper destDesignTime = destination.Instantiate();
destDesignTime.ProvideComp
//Specify the connection manager for the component
if (destination.RuntimeConnec
{
destination.RuntimeConnect
destination.RuntimeConnect
}
//Set custom properties
destDesignTime.SetComponen
destDesignTime.SetComponen
destDesignTime.SetComponen
destDesignTime.SetComponen
destDesignTime.SetComponen
//Create the path from transformation to destination
IDTSPath90 path = dataFlowTask.PathCollectio
//Get the output collection of one component and send it to another
path.AttachPathAndPropagat
destination.InputCollectio
destDesignTime.AcquireConn
destDesignTime.Reinitializ
input = destination.InputCollectio
vInput = input.GetVirtualInput();
foreach (IDTSVirtualInputColumn90 vColumn in vInput.VirtualInputColumnC
{
if (derivedLineageIdentifiers
{
destDesignTime.SetUsageTyp
}
}
IDTSExternalMetadataColumn
foreach (IDTSInputColumn90 inColumn in destination.InputCollectio
{
exColumn = destination.InputCollectio
destDesignTime.MapInputCol
}
destDesignTime.ReleaseConn
ErrorEvents errors = new ErrorEvents();
Logging log = new Logging();
package.Validate(null, null, errors, null);
long start = DateTime.Now.Ticks;
DTSExecResult result = package.Execute(null, null, errors, null, null);
long end = DateTime.Now.Ticks;
lblResult.Text = result.ToString() + " TIME TAKEN: " + TimeSpan.FromTicks(end - start).TotalSeconds.ToStri