Giới thiệu kiến trúc ADO.NET, data source, data provider

    0

    Thư viện ADO(dot)NET mặc dù có kiến trúc không quá phức tạp nhưng lại chứa rất nhiều class. Mỗi class lại có nhiều cách khởi tạo sử dụng object của nhau. Điều này khiến nhiều bạn mới bắt đầu tiếp xúc với ADO.NET cảm thấy hoang mang và rối rắm. Thực ra nếu bạn nắm được kiến trúc của thư viện ADO.NET, mọi thứ sẽ đơn giản và dễ hiểu hơn nhiều.

    Bài học này sẽ chỉ cho bạn chi tiết kiến trúc ADO.NET, các thành phần chính của thư viện ADO.NET, các data source (nguồn dữ liệu) mà ADO.NET có thể truy xuất, khái niệm và các data provider dành cho ADO.NET.

    Khi kết thúc bài học bạn sẽ có cái nhìn hệ thống về ADO.NET và các class chủ chốt của nó, cũng như cách thức các class quan hệ với nhau. Điều này sẽ giúp ích rất lớn khi bạn đi sâu vào từng thành phần cụ thể của ADO.NET.

    Quay trở lại Tự học lập trình ADO.NET và Entity Framework

    Vai trò và vị trí của ADO.NET

    Dữ liệu của chương trình là thành phần quan trọng hàng đầu và có thể được lưu trữ (và truy xuất) theo nhiều cách khác nhau. Có hai hướng đi chính: (1) tự mình quản lý dữ liệu; (2) sử dụng một chương trình hoặc kiến trúc chuyên dụng để quản lý dữ liệu, thường gọi chung là database. Word hay Notepad sử dụng xu hướng thứ nhất, trong khi các ứng dụng quản lý chuyên dụng (Line-of-Business, LOB) thường chọn hướng thứ hai.

    Đối với hướng sử dụng database cũng có hai lựa chọn: (1) sử dụng database theo kiến trúc client-server, (2) sử dụng database dựa trên file. Excel là một ứng dụng sử dụng lựa chọn thứ 2. Trong khi lựa chọn 1 thường gặp ở các ứng dụng LOB. Người ta cũng gọi chung chúng là các nguồn dữ liệu.

    Các database lưu trữ thông tin theo dạng của riêng mình. Thường gặp nhất là dạng bảng, nhưng cũng có thể là dạng xml hoặc json. Trong khi đó, chương trình lưu trữ thông tin dưới dạng chuỗi phân cấp của các object.

    Như vậy, có sự khác biệt lớn giữa cách thức xử lý thông tin của cơ sở dữ liệu và các ngôn ngữ lập trình. Đây chính là nơi ADO.NET thể hiện vai trò của mình: người trung gian giữa database và chương trình.

    Vị trí của ADO.NET giữa chương trình và nguồn dữ liệu
    ADO.NET là một bộ phận của .NET framework. Nó đóng vai trò là một bộ công cụ và một lớp trung gian giúp chương trình tương tác với nguồn dữ liệu.

    Kiến trúc ADO.NET

    Nhìn chung kiến trúc ADO.NET có thể phân chia ra hai thành phần: thành phần kết nối (connected) và thành phần cục bộ (disconnected). Cách thức phân chia này liên quan đến vai trò và nhiệm vụ của các object trong ADO.NET. Hai thành phần này tương tác với nhau thông qua một thành phần đặc biệt: Data Adapter.

    Kiến trúc tổng thể ADO.NET
    ADO.NET chia làm hai nhóm: Disconnected và Connected, tương tác với nhau thông qua Data Adapter

    Thành phần Connected

    Thành phần Connected bao gồm các object chịu trách nhiệm tương tác trực tiếp với nguồn dữ liệu: connection, command, parameter.

    Để ý rằng, ở đây chúng ta chỉ nói về object mà không nói tới class cụ thể nào do ADO.NET có thể làm việc với nhiều loại nguồn dữ liệu. Ứng với mỗi loại nguồn dữ liệu sẽ phải sử dụng nhóm class riêng biệt. Tuy nhiên các class này đều phải thực thi một interface chung.

    Connection chịu trách nhiệm cho việc kết nối tới nguồn dữ liệu. Các công việc chính connection đảm nhiệm là mở/đóng kết nối, kiểm tra tình trạng kết nối. Tất cả các thành phần còn lại của nhóm Connected đều hoạt động trên connection.

    Command là thành phần chịu trách nhiệm thực thi các truy vấn như đọc, ghi, cập nhật, xóa dữ liệu (gọi chung là nhóm lệnh CRUD – Create – Retrieve – Update – Delete). Command cũng thể chịu trách nhiệm làm việc với cấu trúc của nguồn dữ liệu, ví dụ thay đổi cấu trúc bảng. Command hoạt động trên một connection cụ thể.

    Parameter chịu trách nhiệm truyền tham số một cách linh hoạt và an toàn cho các truy vấn. Parameter hoạt động trên các Command và giúp đưa tham số cho các Command.

    Thành phần này phụ thuộc vào loại nguồn dữ liệu. Ví dụ, để làm việc với SQL server phải tạo ra object chuyên dụng cho loại nguồn dữ liệu này (từ class SqlConnection); đối với Oracle, object sẽ được tạo ra từ class OracleConnection.

    Thành phần Disconnected

    Thành phần này chịu trách nhiệm tạo ra một bản sao của (một phần) cơ sở dữ liệu trong bộ nhớ chương trình. Bản sao này cho phép chương trình có thể làm việc với dữ liệu mà không cần duy trì kết nối liên tục tới nguồn dữ liệu.

    Để tạo ra “bản sao” của cơ sở dữ liệu, thành phần Disconnected chứa các class mô phỏng cấu trúc của cơ sở dữ liệu, bao gồm:

    • DataSet (mô phỏng cả cơ sở dữ liệu),
    • DataTable (mô phỏng bảng dữ liệu),
    • DataRow (dòng dữ liệu),
    • DataColumn (cột dữ liệu),
    • DataView (tương tự như view của Sql Server),
    • DataRelation (quan hệ giữa các bảng).

    Thành phần Disconnected không phụ thuộc vào nguồn dữ liệu cụ thể nào. Dữ liệu từ bất kỳ nguồn dữ liệu nào đều có thể đổ vào DataSet, DataTable.

    Thành phần Disconnected không thể tự mình làm việc trực tiếp với nguồn dữ liệu. Thay vào đó, nó phải tương tác với thành phần Connected thông qua Data Adapter để thực hiện các thao tác CRUD.

    Data Adapter

    Data Adapter là thành phần trung gian đặc biệt giúp thành phần Disconnected làm việc với thành phần Connected. Data Adapter hỗ trợ tự động thực hiện các thao tác CRUD với nguồn dữ liệu khi cần thiết.

    Có thể hình dung Data Adapter là cầu nối giữa dữ liệu cục bộ (của thành phần Disconnected) với bộ phận Connected. Ví dụ, khi bộ phận Disconnected cần dữ liệu, Data Adapter tự động gọi tới bộ phận Connected để kết nối và truy vấn dữ liệu. Khi Disconnected cần lưu dữ liệu trở lại, Data Adapter gọi tới Connected để thực thi truy vấn tương ứng.

    Như trên sơ đồ kiến trúc ADO.NET chúng ta có thể để ý, mặc dù nhìn về tổng thể chương trình tương tác với ADO.NET. Tuy nhiên chúng ta lại có một số phương án cụ thể:

    • (1) chỉ làm việc với thành phần Connected;
    • (2) chỉ làm việc với thành phần Disconnected;
    • (3) kết hợp.

    Data Provider

    ADO.NET chia thành phần Connected theo từng loại nguồn dữ liệu. Ví dụ, để làm việc với SQL Server sẽ cần một nhóm class riêng (nằm trong không gian tên System.Data.SqlClient). Tương tự, để làm việc Oracle cũng cần một nhóm class như vậy (trong không gian tên System.Data.OracleClient). Một nhóm class dành cho thành phần Connected để làm việc với một loại nguồn dữ liệu cụ thể như vậy được gọi là Data Provider.

    Data provider trong kiến trúc ADO.NET
    .NET Data provider

    Để làm việc với mỗi loại nguồn dữ liệu sẽ phải xây dựng và sử dụng một data provider tương ứng. Mô hình data provider giúp ADO.NET uyển chuyển và linh hoạt hơn khi cần tiếp cận với các loại nguồn dữ liệu mới. Bất kỳ nhà phát triển database nào cũng có thể tự tạo ra data provider cho ADO.NET hỗ trợ database của mình.

    Phân loại Data Adapter cho ADO.NET
    Phân loại Data Adapter cho ADO.NET
    Nguồn dữ liệuKhông gian tên của provider
    Microsoft SQL Server
    Oracle
    ODBC data source
    OleDb data source
    System.Data.SqlClient
    System.Data.OracleClient
    System.Data.ODBC
    System.Data.OleDb

    Trong khuôn khổ của khóa học này chúng ta chỉ làm việc với provider dành cho SQL Server. Khi nắm được cách thức làm việc với một provider thì hoàn toàn có thể tự học cách làm việc với các loại provider khác.

    Các provider như SqlClient hay OracleClient được gọi là provider chuyên dụng (specialized provider). Trong khi đó ODBC hay OleDb được gọi là các provider chung (generic provider). Provider chuyên dụng có hiệu suất cao và khai thác được những tính năng riêng của nguồn dữ liệu. Provider chung hạn chế về hiệu suất nhưng cho phép làm việc với nhiều loại nguồn dữ liệu khác nhau.

    Kết luận

    Trong bài học này chúng ta đã xem xét vai trò và vị trí của ADO.NET trong phát triển ứng dụng .NET framework. Chúng ta cũng đã xem xét chi tiết kiến trúc cơ bản của ADO.NET.

    Qua đây chúng ta xác định sẽ tập trung sâu vào thành phần Connected của ADO.NET vì nó sẽ tiếp tục được sử dụng trong Entity Framework. Thành phần Disconnected đã cũ và không còn được khuyến khích sử dụng. Chúng ta sẽ không học sâu về thành phần này. Thay vào đó chúng ta sẽ chuyển sang nội dung về Entity Framework.

    Nội dung các bài tiếp theo sẽ lần lượt đi vào chi tiết của từng phần trong kiến trúc này.

    Nếu có thắc mắc hoặc cần trao đổi thêm, mời bạn viết trong phần Bình luận ở cuối trang. Nếu cần trao đổi riêng, hãy gửi email hoặc nhắn tin qua form liên hệ. Nếu bài viết hữu ích với bạn, hãy giúp chúng tôi chia sẻ tới mọi người. Cảm ơn bạn!

    Bình luận

    avatar
      Đăng ký theo dõi  
    Thông báo về