2013-04-03 14 views
5

मैं एक एसएसआईएस पैकेज बना रहा हूं और मैं स्क्रिप्ट घटक के अंदर मौजूदा ओलेडीबीकनेक्शन का उपयोग करना चाहता हूं। यहाँ मेरी कोड है:स्क्रिप्ट घटक के साथ OleDbConnections का उपयोग करना संभव है?

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

} 

जब मैं BIDS बंद करते हैं, मैं निम्न संदेश मिलता है: "System.InvalidCastException: प्रकार की COM ऑब्जेक्ट 'वर्ग प्रकार के' सिस्टम .__ ComObject 'System.Data.OleDb कास्ट करने में असमर्थ ओएलडीबीकनेक्शन '। COM घटकों का प्रतिनिधित्व करने वाले प्रकारों के उदाहरणों को उन प्रकारों में नहीं डाला जा सकता है जो COM घटकों का प्रतिनिधित्व नहीं करते हैं, हालांकि उन्हें अंतर्निहित COM घटक इंटरफ़ेस के आईआईडी के लिए क्वेरी इंटेरफेस कॉल का समर्थन करता है। "

एक ही कोड एक Ado.Net कनेक्शन के साथ ठीक काम करता है। क्या मैं यहां OleDbConnection का उपयोग कर सकता हूं या स्क्रिप्ट घटक केवल Ado.Net का समर्थन करता है?

अग्रिम धन्यवाद।

+0

यह तुम्हारी मदद करेगा: चाल ConnectionString गुण है [कड़ी] (http://akshaya-m.blogspot.com/2017/02/ssis-script-task-connectionstring -for.html) – Akxaya

उत्तर

3

धन्यवाद प्रवीण।

मैं अपने लिंक में प्रासंगिक हिस्सा पाया:

"यदि आप एक कनेक्शन प्रबंधक की AcquireConnection विधि है कि एक अप्रबंधित वस्तु देता है, एक ADO.NET कनेक्शन प्रबंधक का उपयोग करें जब आप ADO कॉन्फ़िगर कॉल करना होगा है।। ओईएल डीबी प्रदाता का उपयोग करने के लिए नेट कनेक्शन मैनेजर, यह ओएलई डीबी के लिए .NET Framework डेटा प्रदाता का उपयोग करके कनेक्ट करता है। इस मामले में, AcquireConnection विधि एक अप्रबंधित ऑब्जेक्ट के बजाय System.Data.OleDb.OleDbConnection देता है। एक्सेल डेटा स्रोत के साथ उपयोग के लिए ADO.NET कनेक्शन मैनेजर, जेट के लिए माइक्रोसॉफ्ट ओएलई डीबी प्रदाता का चयन करें, एक्सेल फ़ाइल निर्दिष्ट करें, और एक्सेल 8.0 (एक्सेल 97 और बाद में) में दर्ज करें, विस्तारित गुणों के मूल्य के रूप में सभी पृष्ठ पर चोर नीलामी प्रबंधक संवाद बॉक्स। "

धन्यवाद!

+0

ने मुझे बहुत मदद की। मैंने ओएलडीडीबी से एडीओ.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 विधि का उपयोग करना चाहते हैं की जरूरत है में उल्लेख किया

आदेश Microsoft.SqlServer.DTSRuntimeWrap के लिए एक संदर्भ जोड़ने OLEDB कनेक्शन का उपयोग करें और नीचे दिए गए कोड की कोशिश करने में

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

MSDNLink

+0

स्क्रिप्ट घटक में ऐसी डीटीएस संपत्ति नहीं है, यह एक स्क्रिप्ट कार्य संपत्ति है। हालांकि मुझे आपके द्वारा प्रदान किए गए लिंक में एक उत्तर मिला, धन्यवाद। – Oscar

3

बस अगर किसी ने इसे गुगल किया और वास्तविक समाधान नहीं मिला, तो आपको OleDbConnection का उपयोग करने के लिए AcquireConnections, PreExceute और ReleaseConnections विधियों को ओवरराइड करना होगा।

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

मुझे नहीं लगता कि यह एकीकृत सुरक्षा के बिना कनेक्शन के साथ काम कर सकता है .. जहां तक ​​मुझे याद है, connMgr.ConnectionString कनेक्शन पासवर्ड नहीं रखता है। – Oscar

संबंधित मुद्दे