2017-03-01 141 views
1

在SSIS中我有以下連接字符串中定義的連接:SSIS腳本任務AcquireConnection返回Null

Data Source=myserver;Initial Catalog=Spears;Provider=SQLNCLI11.1;Integrated Security=SSPI;Auto Translate=False; 

我試圖使用從腳本任務這方面:

ConnectionManager connectionManager = this.Dts.Connections["Spears"]; 
object acquireConnection = connectionManager.AcquireConnection(this.Dts.Transaction); 
SqlConnection con = acquireConnection as SqlConnection; 
con.Open(); 

在執行

  • connectionManager作爲完全填充的ConnectionManager 對象
  • acquireConnection是System._ComObject
  • CON爲null
  • 明顯打開CON失敗

鑄造作爲OleDbConnection的或OdbcConnection返回null爲好。

我在做什麼錯?

+0

檢查'acquireConnection'變量是否爲空。如果不是,那麼將其轉換爲** SqlConnection **失敗,因爲您正在執行'作爲SqlConnection'操作。 也檢查這[來自MS的示例](https://msdn.microsoft.com/en-us/library/ms136018.aspx),根據它,你必須先創建SQLConnection然後分配。 – Ferdipux

回答

1

有幾個問題。首先,您沒有實例化新的SqlConnection對象,如SqlConnection con = new SqlConnection();

其次,除非將容器設置爲參與事務,否則Dts.Transaction將爲空,因此對SqlConnection的強制轉換將爲空。事務是默認支持的,但除非父容器啓動它,否則不會有共享事務。這使得來自MS的例子有點誤導。

我建議與以下。假設你的連接管理器是一個OLEDB連接,添加System.Data.Oledb到usings:

OleDbConnection conn = new OleDbConnection(Dts.Connections[".\\sql2016.SSISAuditDB"].ConnectionString); 
    using (conn) 
    { 
     conn.Open(); 
     OleDbCommand cmd = new OleDbCommand("SELECT 1", conn); 
     int val = (int)cmd.ExecuteScalar(); 
     MessageBox.Show(val.ToString()); 
    } 

在上面的代碼,我們只是從我們的連接管理器搶連接字符串,然後從它創建一個新的連接。請注意,OleDbConnection實現了IDisposable,因此它可以封裝在using()塊中,並且不需要顯式關閉。這是一個很好的做法,因爲這意味着您不需要額外處理關閉連接,例如,如果添加了catch塊。

m

+0

謝謝,這個解決方案讓我獲得了一個工作解決方案的一半。當我嘗試打開連接時,出現以下提示:「登錄用戶'usernameHere'失敗。」這很奇怪,因爲連接管理器中的同一連接在此腳本任務外工作。任何想法或幫助? – Vippy

+0

那是_is_奇!您正在使用集成安全性我的例子。這可能是密碼被ssis消滅了。您可以嘗試將連接字符串存儲在一個變量中,並將其參數化,如果它有效。 –

0

您正在使用帶有SqlConnection對象的SQLNCLI11.1提供程序。更改您的DTS連接,使用「ADO.NET連接」並嘗試。