2013-10-22 44 views
2

我正在編寫一個應用程序,以編程方式將用戶選擇的平面文件導入數據庫(使用其他邏輯,所以我確實需要使用SSIS)。我有一個表中的SSIS包的列表,並加載包並在代碼中執行它。然而,我的SSIS包使用設計時間參數來查找其他數據庫服務器(本例中爲QA)的配置,而不是運行時配置參數。在.NET中覆蓋SSIS配置連接字符串

如何覆蓋連接字符串以使用代碼中提供的連接字符串?

這裏是源的樣品,我使用

Dim app As New Microsoft.SqlServer.Dts.Runtime.Application 
Dim pkg As Microsoft.SqlServer.Dts.Runtime.Package = New Microsoft.SqlServer.Dts.Runtime.Package() 

pkg = app.LoadFromSqlServer(packageName, serverName, Nothing, Nothing, Nothing) 

pkg(0).ConfigurationType = DTSConfigurationType.ISqlServer 


Dim result = pkg.Execute 

回答

2

看看爲DTLoggedExec的源代碼。

在Program.cs文件中有一些設置屬性值的代碼,你可以在你的程序中使用它。

DtsProperty p; 
Variable pkgObj; 
pkgObj = (Variable)package.GetObjectFromPackagePath(valuePath, out p);           

if (p != null && pkgObj != null) 
{ 
Console.WriteLine(" (Parameter Type: " + pkgObj.DataType + ")"); 
p.SetValue(pkgObj, Convert.ChangeType(s[1], pkgObj.DataType)); 
} 

的valuePath是路徑對象和S 1是要投入到該屬性你的價值。對於連接管理器,它通常是這樣的:

\Package.Connections[CONNMGRNAME].Properties[ConnectionString] 
+0

我相信*即使設置了設計時參數,它也能正常工作。如果後面的表達式設置了conn字符串,問題可能會突然出現。在這種情況下,您可以使用類似的代碼更改表達式的值。 –

+0

非常感謝N West。根據您的建議,我最終成功地取消了參數。 – Tachi

1

你的包對象應公開的連接ConnectionManager對象的屬性/集。你可以迭代這個集合來找到你想要修改的CM。之後,將其ConnectionString屬性設置爲任何正確的值。

+0

哦,並且請記住,只有在您對程序包對象運行「執行」之前,才能從代碼更改此值(與其他任何值一樣)。 @NWest所說的仍然適用:如果你在這個特定的ConnestionManager.ConnectionString上設置了一個包內表達式,它的計算值將優先於你從代碼中設置的值。 –

+0

謝謝White_Raven。這是我一直在處理的問題,其中我在代碼中設置的參數值被設計時間值覆蓋。 – Tachi