2013-04-03 27 views
5

Tôi đang xây dựng một gói ssis và tôi muốn sử dụng một OleDbConnection hiện có bên trong Thành phần Script. Đây là mã của tôi:Bạn có thể sử dụng OleDbConnections với thành phần Script?

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

} 

Khi tôi đóng BIDS, tôi nhận được thông báo sau: "System.InvalidCastException: Không thể để cast đối tượng COM của loại 'Hệ thống .__ ComObject' để kiểu lớp 'System.Data.OleDb Các thể hiện của các kiểu đại diện cho các thành phần COM không thể được đúc thành các kiểu không đại diện cho các thành phần COM; tuy nhiên chúng có thể được truyền tới các giao diện miễn là thành phần COM bên dưới hỗ trợ các truy vấn QueryInterface cho IID của giao diện. "

Cùng một mã hoạt động tốt với kết nối Ado.Net. Tôi có thể sử dụng OleDbConnection tại đây hay Script Component chỉ hỗ trợ Ado.Net?

Xin cảm ơn trước.

+0

này sẽ giúp bạn: [link] (http://akshaya-m.blogspot.com/2017/02/ssis-script-task-connectionstring -for.html) – Akxaya

Trả lời

3

Cảm ơn lời khen ngợi.

tôi thấy phần liên quan trong liên kết của bạn:

"Nếu bạn phải gọi phương thức AcquireConnection của một người quản lý kết nối đó trả về một đối tượng không được quản lý, sử dụng một người quản lý kết nối ADO.NET Khi bạn cấu hình ADO.. Trình quản lý kết nối NET để sử dụng một nhà cung cấp OLE DB, nó kết nối bằng cách sử dụng .NET Framework Data Provider cho OLE DB Trong trường hợp này, phương thức AcquireConnection trả về một System.Data.OleDb.OleDbConnection thay vì một đối tượng không được quản lý. Trình quản lý kết nối ADO.NET để sử dụng với nguồn dữ liệu Excel, chọn Nhà cung cấp Microsoft OLE DB cho Máy bay phản lực, chỉ định tệp Excel và nhập Excel 8.0 (cho Excel 97 trở lên) làm giá trị của Thuộc tính mở rộng trên trang Tất cả của Con nection Manager hộp thoại. "

Cảm ơn!

+0

Giúp tôi rất nhiều. Tôi đã thay đổi kết nối từ OLEDB thành ADO.NET và nó hoạt động tốt. – renanlf

7

Như đã đề cập trong 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. 

Bạn cần phải sử dụng ADO.NET quản lý kết nối nếu bạn muốn sử dụng Aquire Connection phương pháp

để sử dụng kết nối OLEDB thêm một tham chiếu đến Microsoft.SqlServer.DTSRuntimeWrap và thử đoạn code dưới đây

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

MSDNLink

+0

Không có thuộc tính Dts như vậy trong Thành phần Tập lệnh, đó là thuộc tính Tác vụ Tập lệnh. Tuy nhiên tôi đã tìm thấy câu trả lời trong liên kết mà bạn cung cấp, cảm ơn. – Oscar

3

Chỉ trong trường hợp ai đó googled này và không thể tìm thấy một giải pháp thực sự, bạn phải ghi đè lên các phương pháp AcquireConnections, PreExceute và ReleaseConnections để sử dụng một OleDbConnection. Bí quyết là thuộc tính 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

Tôi không nghĩ rằng điều này có thể làm việc với các kết nối mà không có bảo mật tích hợp .. Theo như tôi nhớ, connMgr.ConnectionString không giữ mật khẩu kết nối. – Oscar

Các vấn đề liên quan