2010-09-05 43 views
12

tôi thấy đoạn mã này trong một ứng dụngC# DbConnection đúc để SqlConnection

Database database = DatabaseFactory.CreateDatabase("connection string"); 
DbConnection connection = database.CreateConnection(); 
connection.Open(); 
SqlConnection sqlConnection = (SqlConnection)connection; 

có an toàn không, SqlConnection derieve từ DbConnection. Cơ sở dữ liệu đến từ Microsoft.Practices.EnterpriseLibrary.Data. Theo tài liệu CreteDatabase trả về DbConnection.

Trả lời

11

Không an toàn, đúc không bao giờ an toàn và có thể thổi bất cứ lúc nào trong khi ứng dụng của bạn đang chạy. Trong khi SqlConnection có nguồn gốc thực sự từ DbConnection bạn không được đảm bảo rằng database.CreateConnection() sẽ trả lại một SqlConnection vì điều này có thể được tham số trong tệp cấu hình. Ngoài ra, tại sao bạn cần truyền tới SqlConnection? Nó luôn luôn là tốt hơn để làm việc với các lớp học có cao hơn trong hệ thống phân cấp để tránh khớp nối mã của bạn với một thực hiện cụ thể mà sẽ làm cho mã của bạn không thể kiểm tra trong sự cô lập.

Trong khi EnterpriseLibrary thực hiện một công việc khá tốt trong việc giữ mọi thứ trừu tượng, bạn đang giết tất cả mọi thứ với dàn diễn viên này. Ngoài ra, bạn nên đảm bảo rằng tài nguyên dùng một lần luôn được xử lý đúng cách. Thay vào đó, thay vào đó:

Database database = DatabaseFactory.CreateDatabase("connection string"); 
using (var conn = database.CreateConnection()) 
using (var cmd = conn.CreateCommand()) 
{ 
    conn.Open(); 
    cmd.CommandText = "SELECT id FROM foo"; 
    using (var reader = cmd.ExecuteReader()) 
    { 
     while (reader.Read()) 
     { 
      // TODO: work with the results here 
     } 
    } 
} 

Cách này mã của bạn ít mong manh hơn khi thay đổi cơ sở dữ liệu trong tệp cấu hình. Tất nhiên, bạn vẫn có mã SQL cứng này và có các ORM sẽ xử lý tình huống này. Chúng cũng sẽ cho phép bạn tập trung vào miền thực của ứng dụng thay vì lãng phí thời gian trong việc viết các truy vấn SQL và truyền từ một nhà cung cấp cơ sở dữ liệu sang một nhà cung cấp cơ sở dữ liệu khác. Nhưng đối với một ứng dụng đơn giản, điều này là OK.

+0

Có một phương pháp được sử dụng trong mã này cần SqlConnection như một tham số – Darqer

7

Nên an toàn miễn là bạn không bao giờ thay đổi chuỗi kết nối để kết nối với bất kỳ thứ gì khác ngoài Cơ sở dữ liệu SQL Server. Nếu đó là một khả năng, sau đó bạn nên thêm một chút logic hơn để làm cho mọi thứ an toàn:

Database database = DatabaseFactory.CreateDatabase("conn string"); 

using(DbConnection conn = database.CreateConnection()) 
{  
    if(conn is SqlConnection) 
    { 
     var sqlConn = conn as SqlConnection; 
    } 
} 
+0

Không khác biệt lớn, sử dụng 'as' without 'is' và sau đó kiểm tra null là hiệu quả hơn. –

4

Tùy thuộc vào cơ sở dữ liệu bạn đang sử dụng trong ứng dụng của mình. Từ mã bạn đã viết có vẻ như chỉ có SQL Server được sử dụng. Nếu đúng như vậy, bạn có thể truyền DbConnection đến SqlConnection một cách an toàn. Trong thực tế, DbConnection là một lớp cơ sở cho bất kỳ kết nối cơ sở dữ liệu nào khác. Trong trường hợp của bạn là SqlConnection (được sử dụng để làm việc với cơ sở dữ liệu SQL Server), cũng có các cơ sở dữ liệu khác nhau như Oracle, Mysql, v.v ... và nhà cung cấp của họ thường có các lớp riêng để kết nối. Vì vậy, nếu ứng dụng của bạn sử dụng một cơ sở dữ liệu khác hoặc có thể sử dụng trong tương lai thì sẽ không an toàn nếu có dàn diễn viên như vậy.

+2

nó không chỉ phụ thuộc vào cơ sở dữ liệu được sử dụng mà còn trực tiếp phụ thuộc vào kiểu trả về của nhà máy dựa trên cơ sở dữ liệu đang sử dụng. Nếu họ đã từng quyết định tạo một lớp kết nối mới làm việc với máy chủ SQL, mã có thể thất bại –