2010-10-21 58 views
12

Tôi mới dùng .NET và đã nghe về một số cách khác nhau để truy vấn dữ liệu SQL Server như ADO.NET và khung thực thể.Cách tốt nhất để truy cập cơ sở dữ liệu SQL Server bằng C# .Net

Có ai có thể cho tôi một số lời khuyên về cách tốt nhất để sử dụng các ứng dụng mới không?

Cảm ơn bạn đã được trợ giúp hoặc gợi ý.

+0

Bạn có bao nhiêu trải nghiệm lập trình? Đã sử dụng cơ sở dữ liệu trước đây chưa? – Onkelborg

+0

Tôi có một số kiến ​​thức cơ bản về C# và biết SQL, tôi đã không phải truy cập vào một db trong một chương trình C# trước đây. – user483267

+1

Đó là một câu hỏi mở rộng. Bất kỳ câu trả lời hay nào cũng sẽ phụ thuộc vào những gì bạn muốn làm, khung thời gian bạn phải làm việc với, và những gì bạn đã quen thuộc/thoải mái. – jac

Trả lời

10

Dưới đây là một ví dụ sử dụng EF với tạo mã từ cơ sở dữ liệu (đối với một ứng dụng thực bạn có thể muốn tạo DB của mình từ mã, thay vào đó):

  1. Nhấp chuột phải vào dự án của bạn >> Thêm >> Mới I tem >> ADO.NET Entity Data Model.
  2. Chọn tên cho tổ chức của bạn ví dụ: MyEntities.edmx, nhấn Next
  3. Chọn "Tạo từ cơ sở dữ liệu"
  4. Configure một 'New Connection' nếu không có một đã ở đó. Kế tiếp.
  5. Chọn Bảng, Chế độ xem và SPROC mà bạn muốn đưa vào thực thể. Hoàn thành.

Bạn sẽ thấy tệp MyEntities.edmx được thêm vào dự án của bạn. Bạn có thể mở nó trong dạng xem thiết kế để xem sơ đồ các thực thể và mối quan hệ của bạn. Lưu ý rằng mỗi thực thể phải có khóa chính - cách dễ nhất để thực hiện việc này là thêm trường ID - tự động gia tăng vào mỗi bảng hoặc cột GUID. Dù sao bây giờ bạn có thể truy vấn db của bạn như thế này:

// assuming a "Product" table, which has an entity pluralized to "Products" 

MyEntities db = new MyEntities(); 

var cheapProducts = db.Products.Where(p => p.Price > 30); // var is IEnumerable<Product> 
2

NHibernate là con đường để đi. Xem http://nhforge.orghttp://sf.net/projects/nhibernate để biết thêm thông tin.

Sự khác biệt chính giữa khung thực thể và NHibernate là khung thực thể chỉ dành cho Microsoft SQL Server (Oracle là loại được hỗ trợ, nhưng hỗ trợ không phải là lý tưởng). NHibernate hỗ trợ cơ sở dữ liệu many many many.

+1

Cũng xem xét việc sử dụng Fluent NHibernate nếu bạn thực hiện tùy chọn này. –

2

Entity Framework là dễ dàng nhất, và nó được xây dựng trong

. Tất cả bạn phải làm là quan trọng mô hình của bạn, và sau đó chỉ cần cập nhật các lớp học đơn giản, có thể tự động ánh xạ tới db của bạn.

Giống như cập nhật các đối tượng bình thường, nhưng cuối cùng bạn gọi SaveChanges.

+1

Nếu bạn đang bắt đầu dự án kéo dài vài năm không sử dụng EF. Nó sẽ gây ô nhiễm đối tượng miền của bạn với thông tin trạng thái. Sẽ buộc bạn phải sử dụng phong cách cụ thể của mã hóa ... VisualStudio công cụ cho EF được một nửa sao lưu. Đối với các dự án dài, tôi sẽ khuyên bạn nên sử dụng NHibernate. –

+0

BS như vậy, ra khỏi hộp bạn nhận được thực thể với nhà nước. Nhưng có những lựa chọn rất đơn giản khác. Bạn đã từng xem EF gần đây chưa? Hãy để tôi giúp bạn .. (http://channel9.msdn.com/Blogs/wriju/POCO-Template-in-ADONET-Entity-Framework) – Nix

2

LINQ to SQL khá dễ làm việc. Bạn có thể kéo và thả các bảng cơ sở dữ liệu của mình vào trình thiết kế và viết các truy vấn khá đơn giản sau vài phút.

NorthwindDataContext db = new NorthwindDataContext(); 

    var products = from p in db.Products 
        select p; 

Mà về cơ bản sẽ chuyển thành SELECT * FROM Sản phẩm

Một vài lựa chọn các mẫu khác:

var products = from p in db.Products 
        where p.Category.Name == "Beverages" 
        select p; 

    var products = from p in db.Products 
        orderby p.Name 
        select p; 
+2

'var products = db.Products;' – SLaks

+1

Đang cố gắng hiển thị cú pháp LINQ ... đó là hơi tương tự như SQL – Dismissile

+0

Đối với một giải pháp ORM đa mục đích trên một dự án mới tôi muốn đi với NHibernate trên Linq-to-sql nhưng điều này có lẽ sẽ dễ dàng hơn để làm việc với ra khỏi hộp. – flatline

2

Theo tôi giải pháp tốt nhất là tạo ra lớp trung gian giữa db và ứng dụng (một số loại hình lớp dữ liệu), trong đó một số phương pháp để quản lý truy vấn. Mô tả dưới đây dựa trên SQLite như một phép loại suy để SQLServer (ADO kết nối)

lớp đề cập có thể bằng cách singleton, và bạn có thể gọi nó là ví dụ bất cứ nơi nào bạn muốn trong ứng dụng của bạn - ví SQLite nó có thể trông như thế:

private static SQLite instance; 

public static SQLite getInstance() 
{ 
    if(instance == null) 
    { 
    instance = new SQLite(); 
    thread = Thread.CurrentThread.ManagedThreadId; 
    } 
    return instance; 
} 

Bạn có thể lấy ví dụ như sau:

SQLite db = SQLite.getInstance(); 

lớp này có thể chứa nhiều phương pháp để thao tác dữ liệu ví dụ:

public SQLiteCommand prepareQuery(string sql) 
{ 
    cmd = new SQLiteCommand(sql, conn); 
    return cmd; 
} 

public SQLiteDataReader executeReader() 
{ 
    return cmd.ExecuteReader(); 
} 

public int executeInt() 
{ 
    object obj = cmd.ExecuteScalar(); 
    return (int)obj; 
} 

nhưng cũng quản lý giao dịch và phương pháp chẩn đoán. Vì vậy, bây giờ - bạn có thể sử dụng lớp này giống như bạn trong ứng dụng nếu bạn có các nguồn db khác hoặc thậm chí các kiểu db, bạn có thể tạo lớp dữ liệu tiếp theo (ví dụ cho Oracle hoặc MSSQL, MySQL ...). cùng một giao diện, ví dụ:

IDataBase 

và bây giờ, bạn có một số loại mặt tiền mà bạn có thể thay thế khi cần thiết một cách năng động. Từ thời điểm này bằng cách sử dụng db trong ứng dụng được tập trung ở một nơi, và nó là niềm vui tinh khiết cho lập trình viên để sử dụng nó - đó là gợi ý của tôi.

+1

Có lẽ dễ dàng hơn để sử dụng một bản tóm tắt DB tồn tại từ trước thay vì quay lên của riêng bạn, trừ khi mục tiêu của OP hoàn toàn là giáo dục. – Jimmy

+0

Thật khó trong tình huống như vậy để có được lớp đồng nhất tương thích với tất cả người đăng ký – UGEEN

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