2013-04-03 2 views
5

Я строю пакет ssis, и я хочу использовать существующее OleDbConnection внутри Компонента скрипта. Вот мой код:Можно использовать OleDbConnections с компонентом Script?

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

} 

Когда я закрываю предложения, я получаю следующее сообщение: « System.InvalidCastException: Невозможно бросить COM объект типа„System .__ ComObject“для типа класса«System.Data.OleDb .OleDbConnection '. Экземпляры типов, которые представляют COM-компоненты, нельзя отнести к типам, которые не представляют COM-компоненты, однако они могут быть переданы в интерфейсы, если базовый COM-компонент поддерживает вызовы QueryInterface для IID интерфейса ».

Тот же код прекрасно работает с подключением Ado.Net. Могу ли я использовать OleDbConnection здесь, или Script Component поддерживает только Ado.Net?

Заранее спасибо.

+0

Это поможет вам: [ссылка] (http://akshaya-m.blogspot.com/2017/02/ssis-script-task-connectionstring -for.html) – Akxaya

ответ

3

Спасибо, praveen.

я нашел соответствующую часть в вашей ссылке:

«Если вы должны вызвать метод AcquireConnection из диспетчера соединений, возвращающего неуправляемый объект, использовать диспетчер соединений ADO.NET При настройке ADO.. NET для использования поставщика OLE DB, он подключается с помощью поставщика данных .NET Framework для OLE DB. В этом случае метод AcquireConnection возвращает System.Data.OleDb.OleDbConnection вместо неуправляемого объекта. ADO.NET для использования с источником данных Excel, выберите поставщика Microsoft OLE DB для Jet, укажите файл Excel и введите Excel 8.0 (для Excel 97 и более поздних версий) в качестве значения расширенных свойств на странице «Все» Против Диалоговое окно Диспетчер связей. "

Спасибо!

+0

Помог мне много. Я изменил свое соединение с OLEDB на ADO.NET, и он работал нормально. – renanlf

7

Как уже упоминалось в 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. 

Вы должны использовать ADO.NET диспетчер соединений, если вы хотите использовать Aquire Connection методу

для того, чтобы использовать соединение OLEDB добавить ссылку на Microsoft.SqlServer.DTSRuntimeWrap и попробуйте следующий код

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

MSDNLink

+0

Не существует такого свойства Dts в Script Component, это свойство Script Task. Однако я нашел ответ в приведенной ссылке, спасибо. – Oscar

3

На всякий случай кто-то искал это и не мог найти реального решения, вам необходимо переопределить методы AcquireConnections, PreExceute и ReleaseConnections, чтобы использовать OleDbConnection. Хитрость это свойство 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); 
} 

НТН

+2

Я не думаю, что это может работать с соединениями без интегрированной защиты. Насколько я помню, connMgr.ConnectionString не поддерживает пароль для подключения. – Oscar

Смежные вопросы