2010-08-15 11 views
15

मैं डेटा एक्सेस लेयर बनाना चाहता हूं जो किसी भी डेटा प्रदाता के साथ काम करता है।एक डीबीडेटाएडाप्टर को डीबीकॉमैंड या डीबीकनेक्शन कैसे बनाया जाए?

मुझे पता है कि कनेक्शन पर उपलब्ध फैक्टरी विधि का उपयोग करके DbCommand बनाना संभव है।

objDbCon.CreateCommand(); 

हालांकि, मुझे DbDataAdapter बनाने के लिए कुछ भी नहीं मिला। क्या यह ADO.NET में एक बग है या क्या?

उत्तर

10

DbProviderFactory.CreateDataAdapter *

इसके अलावा, आप DbProviderFactories वर्ग के माध्यम से सभी पंजीकृत DbProviders मिल सकती है।

* मुझे लगता है कि यह इस विधि के लिए एक गलत जगह है।

+2

है? –

+0

@ इयान बॉयड http://msdn.microsoft.com/en-us/library/hh323136.aspx –

5

हालांकि सर्गेई ने इसका उत्तर दिया था, लेकिन मुझे इसे अपनी जरूरतों के अनुसार अनुवाद करने में थोड़ी देर लग गई। तो मेरी समझ थी कि यदि आप एक DbConnection था, लेकिन आप हुड के नीचे एक SqlClient उपयोग कर रहे थे अपने कोड कुछ ऐसा दिखाई देगा जानता था:

DbDataAdapter da = DbProviderFactories.GetFactory("System.Data.SqlClient").CreateDataAdapter(); 
1

यह देखते हुए कि आप कनेक्शन आप दिया जाता है के प्रकार पता नहीं है,। नेट समस्या को हल करने का कोई अच्छा तरीका नहीं प्रदान करता है।

/// <summary> 
/// Construct a DataAdapater based on the type of DbConnection passed. 
/// You can call connection.CreateCommand() to create a DbCommand object, 
/// but there's no corresponding connection.CreateDataAdapter() method. 
/// </summary> 
/// <param name="connection"></param> 
/// <exception>Throws Exception if the connection is not of a known type.</exception> 
/// <returns></returns> 
public static DbDataAdapter CreateDataAdapter(DbConnection connection) 
{ 
    //Note: Any code is released into the public domain. No attribution required. 

    DbDataAdapter adapter; //we can't construct an adapter directly 
     //So let's run around the block 3 times, before potentially crashing 

    if (connection is System.Data.SqlClient.SqlConnection) 
     adapter = new System.Data.SqlClient.SqlDataAdapter(); 
    else if (connection is System.Data.OleDb.OleDbConnection) 
     adapter = new System.Data.OleDb.OleDbDataAdapter(); 
    else if (connection is System.Data.Odbc.OdbcConnection) 
     adapter = new System.Data.Odbc.OdbcDataAdapter(); 
    else if (connection is System.Data.SqlServerCe.SqlCeConnection) 
     adapter = new System.Data.SqlServerCe.SqlCeDataAdapter(); 
    else if (connection is Oracle.ManagedDataAccess.Client.OracleConnection) 
     adapter = new Oracle.ManagedDataAccess.Client.OracleDataAdapter(); 
    else if (connection is Oracle.DataAccess.Client.OracleConnection) 
     adapter = new Oracle.DataAccess.Client.OracleDataAdapter(); 
    else if (connection is IBM.Data.DB2.DB2Connection) 
     adapter = new IBM.Data.DB2.DB2DataAdapter(); 
    //TODO: Add more DbConnection kinds as they become invented 
    else 
    { 
     throw new Exception("[CreateDataAdapter] Unknown DbConnection type: " + connection.GetType().FullName); 
    } 

    return adapter; 
} 
+1

यह काम करेगा, लेकिन मुझे यह करने का सबसे अच्छा तरीका नहीं लगता :) – Karim

+2

@ करिम मैं *** प्यार करता हूँ *** एक बेहतर समाधान। मैंने 'कनेक्शन। क्रिएटएडापेटर', या 'डीबीप्रोवाइडर फैक्ट्रीज.गेट फैक्ट्री (कनेक्शन)', या 'डीबीप्रोवाइडर फैक्ट्रीज। गेट फैक्ट्री (टाइपऑफ (कनेक्शन))', या *** कुछ *** सोचा होगा। –

+0

ध्यान दें कि ऐसा लगता है कि ADO.NET टीम * वास्तव में * .NET 4.5 के रूप में लागू की गई है। –

15

.NET 4.5 के रूप में, जब प्रदाता स्वतंत्र कोड लिखने, अब आप DbProviderFactories.GetFactory अधिभार कि एक DbConnection स्वीकार करता है सही प्रदाता कारखाने जिसमें से आप तो एक बना सकते हैं प्राप्त करने के लिए उपयोग कर सकते हैं: यहाँ हम क्या उपयोग है डेटा एडाप्टर।

उदाहरण:

DbDataAdapter CreateDataAdapter(DbConnection connection) 
{ 
    return DbProviderFactories.GetFactory(connection).CreateDataAdapter(); 
} 

ऐसा लगता है ADO.NET टीम पर किसी को पढ़ा उसके जवाब पर इयान बॉयड टिप्पणी ... :)

+2

मैं बस इस समस्या के समाधान के लिए Googled; एक साल बाद। मेरे हार्ड-कोड किए गए मामले 'SqlCeConnection' और' SqlCeDataAdapter' को संभाल नहीं पाते हैं। और चूंकि यह साझा कोड है, इसलिए मैं प्रत्येक क्लाइंट को 'SQL सर्वर सीई' स्थापित करने के लिए मजबूर नहीं करना चाहता हूं जब वे इसका उपयोग भी नहीं कर रहे हैं। पहली जगह में क्या जरूरत होनी चाहिए यह जानने के लिए आप के लिए धन्यवाद! –

+0

क्या यह लिखा गया है कि ** GetFactory (कनेक्शन) ** केवल ** में काम कर रहा है। नेट 4.5 ** ?, क्योंकि [एमएसडीएन] (https://msdn.microsoft.com/en-us/library/hh323136 (v = vs.100) .aspx) कहता है कि यह ** 4.0 ** में समर्थित है, लेकिन मेरे मामले में यह नहीं है। – mayank

0

आप DataTable में डेटा प्राप्त करने के लिए एक और तरीका है का उपयोग कर सकते डीबीडेटा एडाप्टर के बिना।

यहाँ देखते हुए एक `DbCommand` या` DbConnection`, तुम कैसे मिलता है इसी `DbProviderFactory` मेरी कोड

   DataTable dt = new DataTable(); 
       using (IDataReader dr = com.ExecuteReader()) 
       { 
        if (dr.FieldCount > 0) 
        { 
         for (int i = 0; i < dr.FieldCount; i++) 
         { 
          DataColumn dc = new DataColumn(dr.GetName(i), dr.GetFieldType(i)); 
          dt.Columns.Add(dc); 
         } 
         object[] rowobject = new object[dr.FieldCount]; 
         while (dr.Read()) 
         { 
          dr.GetValues(rowobject); 
          dt.LoadDataRow(rowobject, true); 
         } 
        } 
       } 
       return dt; 
2
private static DbDataAdapter CreateDataAdapter(DbCommand cmd) 
{ 
    DbDataAdapter adapter; 

    /* 
    * DbProviderFactories.GetFactory(DbConnection connection) seams buggy 
    * (.NET Framework too old?) 
    * this is a workaround 
    */ 
    string name_space = cmd.Connection.GetType().Namespace; 
    DbProviderFactory factory = DbProviderFactories.GetFactory(name_space); 
    adapter = factory.CreateDataAdapter(); 
    adapter.SelectCommand = cmd; 
    return adapter; 
} 
संबंधित मुद्दे