2010-08-15 2 views

답변

10

DbProviderFactory.CreateDataAdapter은 또한 당신은 DbProviderFactories 클래스를 통해 등록 된 모든 DbProviders를 얻을 수 있습니다.

*이 방법에 대한 잘못된 위치라고 생각합니다.

+2

입니까? –

+0

@ 이안 보이드 http://msdn.microsoft.com/en-us/library/hh323136.aspx –

5

비록 이것이 Sergey에 의해 잘 대답되었지만, 그것을 내 자신의 필요에 맞게 번역하는 데 조금 시간이 걸렸습니다. 그래서 내 이해했다 당신이 DbConnection을했지만, 당신은 당신의 코드가 같은 것을 보일 것 후드 아래에하는 SqlClient를 사용하고 알고 있다면 그 : 당신은 당신이 주어진 연결 유형을 모르는 점을 감안

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

을. NET은 문제를 해결할 좋은 방법을 제공하지 않습니다. 공급자 독립적 인 코드를 작성할 때

.NET 4.5의로
/// <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

@ 카림 내가 사랑해 *** *** 더 나은 해결책. 나는'connection.CreateAdapater' 또는'DbProviderFactories.GetFactory (연결)','DbProviderFactories.GetFactory (typeof (연결))'또는 *** something ***을 생각했을 것입니다. –

+0

ADO.NET 팀이 .NET 4.5에서 실제로 구현 한 것 같습니다. –

15

, 당신은 지금 당신이 다음을 만들 수있는 올바른 공급자 공장을 얻기 위해 DbConnection을 허용 DbProviderFactories.GetFactory 과부하를 사용할 수 있습니다 여기에 우리가 무엇을 사용 데이터 어댑터.

예 :

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

당신의 DataTable에 데이터를 얻기 위해 다른 방법을 사용할 수 있습니다 :

+2

나는이 문제에 대한 해결책을 찾았다. 1 년 후. 하드 코딩 된 케이스는'SqlCeConnection'과'SqlCeDataAdapter'를 처리하지 않습니다. 그리고 이것은 공유 코드이기 때문에 모든 클라이언트가 SQL 서버 CE를 사용하지 않을 때 강제 설치하는 것을 원하지 않습니다. 처음에 필요한 것이 무엇인지 찾아내는 것에 대한 명성! –

+0

[** MSDN] (https://msdn.microsoft.com/en-us/library/hh323136) 때문에 ** GetFactory (연결) **가 **. net 4.5 **에서만 작동하는 곳에서 작성 되었습니까? (v = vs.100) .aspx)는 ** 4.0 **에서 지원한다고 말하지만, 제 경우에는 그렇지 않습니다. – mayank

0

... ADO.NET 팀의 누군가가 그의 대답에 이안 보이드의 코멘트를 읽어 보인다 DbDataAdapter없이 여기

는`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; 
} 
관련 문제