2013-04-03 14 views
5

Buduję pakiet ssis i chcę użyć istniejącego składnika OleDbConnection wewnątrz komponentu skryptu. Tu jest mój kodu:Możliwe jest użycie OleDbConnections z komponentem Script?

public override void AcquireConnections(object Transaction) 
{ 
    base.AcquireConnections(Transaction); 
    cm = this.Connections.Connection; 
    con = (OleDbConnection)cm.AcquireConnection(Transaction); 
    MessageBox.Show(con.ToString()); 

} 

Kiedy zamykam ofert, pojawia się następujący komunikat: „System.InvalidCastException: Nie można rzutować obiektu COM typu«system .__ ComObject»do rodzaju klasy„System.Data.OleDb .OleDbConnection. Instancje typów reprezentujących komponenty COM nie mogą być rzutowane na typy, które nie reprezentują komponentów COM, jednak można je rzutować na interfejsy, o ile podstawowy składnik COM obsługuje wywołania QueryInterface dla IID interfejsu. "

Ten sam kod działa poprawnie z połączeniem Ado.Net. Czy mogę użyć tutaj OleDbConnection lub składnik skryptów obsługuje tylko Ado.Net?

Z góry dziękuję.

+0

To pomoże ci: [link] (http://akshaya-m.blogspot.com/2017/02/ssis-script-task-connectionstring -for.html) – Akxaya

Odpowiedz

3

Dzięki praveen.

znalazłem odpowiedni udział w linku:

„Jeśli musisz wywołać metodę AcquireConnection z menedżer połączeń, która zwraca obiekt niezarządzanego, używania menedżer połączeń ADO.NET Podczas konfigurowania ADO.. Menedżer połączeń NET do korzystania z dostawcy OLE DB, łączy się za pomocą dostawcy danych .NET Framework dla OLE DB W tym przypadku metoda AcquireConnection zwraca obiekt System.Data.OleDb.OleDbConnection zamiast obiektu niezarządzanego. Menedżer połączeń ADO.NET do użytku ze źródłem danych programu Excel, wybierz dostawcę Microsoft OLE DB dla Jet, określ plik Excel i wprowadź program Excel 8.0 (dla programu Excel 97 i nowszego) jako wartość właściwości rozszerzonych na stronie Wszystkie Kon okno dialogowe menedżera nection. "

Dzięki!

+0

Pomógł mi dużo. Zmieniłem połączenie z OLEDB na ADO.NET i działało dobrze. – renanlf

7

Jak wspomniano w MSDN

You cannot call the AcquireConnection method of connection managers that return 
unmanaged objects, such as the OLE DB connection manager and the Excel 
connection manager, in the managed code of a Script task. 

trzeba użyć ADO.NET menedżer połączeń, jeśli chcesz używać Aquire Connection metoda

w celu korzystania z połączenia OLEDB dodać odwołanie do Microsoft.SqlServer.DTSRuntimeWrap i spróbować poniższy kod

ConnectionManager cm = Dts.Connections["oledb"]; 
IDTSConnectionManagerDatabaseParameters100 cmParams = 
cm.InnerObject as IDTSConnectionManagerDatabaseParameters100; 
OleDbConnection conn = cmParams.GetConnectionForSchema() as OleDbConnection; 

MSDNLink

+0

Nie ma takiej właściwości Dts w Skrypt Component, jest to właściwość Task Script. Jednak znalazłem odpowiedź w linku, który podałeś, dziękuję. – Oscar

3

Na wypadek, gdyby ktoś googlował i nie mógł znaleźć prawdziwego rozwiązania, konieczne jest zastąpienie metod AcquireConnections, PreExceute i ReleaseConnections w celu użycia OleDbConnection. Sztuką jest właściwość ConnectionString:

OleDbConnection con; 
OleDbCommand cmd; 
IDTSConnectionManager100 connMgr; 

/*Here you prepare the connection*/ 
public override void AcquireConnections(object Transaction) 
{ 
    base.AcquireConnections(Transaction); 
    connMgr = this.Connections.YourConnName; 
    con = new OleDbConnection(connMgr.ConnectionString); 
} 

/*Here you prepare the sql command and open the connection*/ 
public override void PreExecute() 
{ 
    base.PreExecute(); 
    cmd = new OleDbCommand("Some Select", con); 
    cmd.CommandType = CommandType.Text; 
    con.Open(); 
} 

/*Here you execute your query for each input row*/ 
public override void Entrada0_ProcessInputRow(Entrada0Buffer Row) 
{ 
    OleDbDataReader dr = cmd.ExecuteReader(); 

    while (dr.Read()) 
    { 
     /*Do your stuff*/ 
    } 
} 

/*And here you release the connection*/ 
public override void ReleaseConnections() 
{ 
    base.ReleaseConnections(); 
    connMgr.ReleaseConnection(con); 
} 

HTH

+2

Nie sądzę, że to może działać z połączeniami bez zintegrowanego bezpieczeństwa. O ile pamiętam, connMgr.ConnectionString nie przechowuje hasła połączenia. – Oscar

Powiązane problemy