2008-10-09 59 views
20

Tôi có một chuỗi kết nối được chuyển đến một hàm, và tôi cần phải tạo đối tượng dựa trên DbConnection (ví dụ: SQLConnection, OracleConnection, OLEDbConnection vv) dựa trên chuỗi này.C# Lấy đối tượng DbConnection đúng bằng chuỗi kết nối

Có chức năng sẵn có nào để thực hiện việc này hay bất kỳ thư viện của bên thứ ba nào để hỗ trợ. Chúng tôi không nhất thiết phải xây dựng chuỗi kết nối này, vì vậy chúng tôi không thể dựa vào định dạng mà chuỗi được viết để xác định loại của nó và tôi sẽ thích không phải mã hóa tất cả các kết hợp và hoán vị của các chuỗi kết nối có thể được

Trả lời

29
DbConnection GetConnection(string connStr) 
    { string providerName = null; 
     var csb = new DbConnectionStringBuilder{ConnectionString=connStr}; 

     if (csb.ContainsKey("provider")) 
     { providerName = csb["provider"].ToString(); 
     }   
     else 
     { var css = ConfigurationManager 
          .ConnectionStrings 
          .Cast<ConnectionStringSettings>() 
          .FirstOrDefault(x=>x.ConnectionString==connStr); 
     if (css != null) providerName = css.ProviderName; 
     } 

     if (providerName != null) 
     { var providerExists = DbProviderFactories 
            .GetFactoryClasses() 
            .Rows.Cast<DataRow>() 
            .Any(r=>r[2].Equals(providerName)); 
     if (providerExists) 
      { var factory = DbProviderFactories.GetFactory(providerName); 
      var dbConnection = factory.CreateConnection(); 

      dbConnection.ConnectionString = connStr; 
      return dbConnection; 
      } 
     } 

     return null; 
    } 
+0

Tôi cũng không nghĩ rằng nó sẽ làm việc cho OleDb chuỗi kết nối như: Provider = Microsoft.ACE.OLEDB.12.0; Data Source = 9cb8a4c4-9661-4c10-a21c-fb4a85ce2471.xlsx; Chế độ = ReadWrite; Thuộc tính mở rộng = "Excel 12.0 Xml; HDR = YES; IMEX = 0;" –

+0

Không, nó sẽ chỉ trả lại kết nối OLEDB nếu nhà cung cấp được chỉ định là "System.Data.OleDb" hoặc nếu chuỗi kết nối được chỉ định trong cấu hình. –

+0

Tôi thấy điều này thực sự đáng ngạc nhiên, rằng bạn không thể làm cho mã của bạn độc lập với DB mà không có loại rắc rối này. –

1

Bạn sẽ có thể phân tích phần Nhà cung cấp và chuyển nó vào DbProviderFactories.GetFactory sẽ trả về một OdbcFactory, OleDbFactory hoặc SqlClientFactory và cho phép bạn sau đó thực hiện CreateConnection v.v.

Tôi không chắc chắn cách thức này sẽ làm việc với Oracle trừ khi họ cung cấp một OracleDbFactory.

18

nếu bạn đang sử dụng khung 2.0 trở lên và bạn có thể đưa chúng vào chuỗi thứ hai với lớp trình điều khiển, bạn có thể sử dụng lớp dbProviderFactory để tải trình điều khiển cho bạn.

DbProviderFactory dbProviderFactory = DbProviderFactories.GetFactory(myDriverClass); 
DbConnection dbConnection = dbProviderFactory.CreateConnection(); 
dbConnection.ConnectionString = myConnectionString; 

Dưới đây là một liên kết MSDN đến lớp Factory: http://msdn.microsoft.com/en-us/library/wda6c36e.aspx

1

Hầu hết các chuỗi kết nối (ít nhất là trong .NET 2.0) cũng có một tài sản providerName mà đi với họ. Vì vậy, một kết nối chuỗi SQL sẽ có một tên nhà cung cấp như:

providerName="System.Data.SqlClient" 

Vì vậy, phương pháp của bạn sẽ cần phải chấp nhận cả những chuỗi kết nối và tên nhà cung cấp và sau đó bạn có thể sử dụng DbProviderFactory as mentioned by damieng.

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