Truy cập dữ liệu với ADO.NET - Pdf 63

Truy cập dữ liệu với ADO.NET Gvhd: Nguyễn Tấn Trần Minh Khang

144 Chương 14 Truy cập dữ liệu với ADO.NET
Trong thực tế, có rất nhiều ứng dụng cần tương tác với cơ sở dữ liệu. .NET
Framework cung cấp một tập các đối tượng cho phép truy cập vào cơ sở dữ liệu, tập
các đối tượng này được gọi chung là ADO.NET.
ADO.NET tương tự với ADO, điểm khác biệt chính ở chỗ ADO.NET là một kiến
trúc dữ liệu rời rạc, không kết nối (Disconnected Data Architecture). Với kiến trúc
này, dữ liệu được nhận về từ cơ sở dữ liệu và được lưu trên vùng nhớ cache của
máy người dùng. Người dùng có thể thao tác trên dữ liệu họ nhận về và chỉ kết nối
đến cơ sở dữ liệu khi họ cần thay đổi các dòng dữ liệu hay yêu cầu dữ liệu mới.
Việc kết nối không liên tục đến cơ sở dữ liệu đã đem lại nhiều thuận lợi, trong đó
điểm lợi nhất là việc giảm đi một lưu lượng lớn truy cập vào cơ sở dữ liệu cùng một
lúc, tiết kiệm đáng kể tài nguyên bộ nhớ. Giảm thiểu đáng kể vấn đề hàng trăm
ngàn kết nối cùng truy cập vào cơ sở dữ liệu cùng một lúc.
ADO.NET kết nối vào cơ sở dữ liệu để lấy dữ liệu và kết nối trở lại để cập nhật dữ
liệu khi người dùng thay đổi chúng. Hầu hết mọi ứng dụng đều sử dụng nhiều thời
gian cho việc đọc và hiển thị dữ liệu, vì thế ADO.NET đã cung cấp một tập hợp
con các đối tượng dữ liệu không kết nối cho các ứng dụng để người dùng có thể đọc
và hiển thị chúng mà không cần kết nối vào cơ sở dữ liệu.
Các đối tượng ngắt kết nối này làm việc tương tự đối với các ứng dụng Web.
14.1 Cơ sở dữ liệu và ngôn ngữ truy vấn SQL
Để có thể hiểu rõ được cách làm việc của ADO.NET, chúng ta cần phải nắm được
một số khái niệm cơ bản về cơ sở dữ liệu quan hệ và ngôn ngữ truy vấn dữ liệu,
như: khái niệm về dòng, cột, bảng, quan hệ giữa các bảng, khóa chính, khóa ngoại
và cách truy vấn dữ liệu trên các bảng bằng ngôn ngữ truy vấn SQL : SELECT,
UPDATE, DELETE … hay cách viết các thủ tục ( Store Procedure) …. Trong
phạm vi của tài liệu này, chúng ta sẽ không đề cập đến các mục trên.

ADO.NET. DataSet được thiết kế để có thể thích ứng với bất kỳ nguồn dữ liệu nào.
DataSet chứa một hay nhiều đối tượng DataTable mà nó được tạo từ tập các dòng
và cột dữ liệu, cùng với khoá chính, khóa ngoại, ràng buộc và các thông tin liên
Truy cập dữ liệu với ADO.NET Gvhd: Nguyễn Tấn Trần Minh Khang

146
quan đến đối tượng DataTable này. Bản thân DataSet được dạng như một tập tin
XML.
Thành phần chính thứ hai của ADO.NET chính là NET Provider Data, nó chứa các
đối tượng phục vụ cho việc thao tác trên cơ sở dữ liệu được hiệu quả và nhanh
chóng, nó bao gồm một tập các đối tượng Connection, Command, DataReader và
DataAdapter. Đối tượng Connection cung cấp một kết nối đến cơ sở dữ liệu,
Command cung cấp một thao tác đến cơ sở dữ liệu, DataReader cho phép chỉ đọc
dữ liệu và DataAdapter là cấu nối trung gian giữa DataSet và nguồn dữ liệu.
14.4 Mô hình đối tượng ADO.NET
Có thể nói mô hình đối tượng của ADO.NET khá uyển chuyển, các đối tượng của
nó được tạo ra dựa trên quan điểm đơn giản và dễ dùng. Đối tượng quan trọng nhất
trong mô hình ADO.NET chính là
Dataset. Dataset
có thể được xem như là thể
hiện của cả một cơ sở dữ liệu con, lưu trữ trên vùng nhớ cache của máy người dùng
mà không kết nối đến cơ sở dữ liệu.
14.4.1 Mô hình đối tượng của Dataset
Hình 14-2 Mô hình đối tượng Dataset

DataSet bao gồm một tập các đối tượng DataRelation cũng như tập các đối tượng
DataTable. Các đối tượng này đóng vai trò như các thuộc tính của DataSet.
Truy cập dữ liệu với ADO.NET Gvhd: Nguyễn Tấn Trần Minh Khang

147

14.4.6 Đối tượng DataAdapter
ADO.NET dùng DataAdapter như là chiếc cầu nối trung gian giữa DataSet và
DataSource ( nguồn dữ liệu ), nó lấy dữ liệu từ cơ sở dữ liệu sau đó dùng phương
Fill() để đẩy dữ liệu cho đối tượng DataSet. Nhờ đối tượng DataAdapter này mà
DataSet tồn tại tách biệt, độc lập với cơ sở dữ liệu và một DataSet có thể là thể hiện
của một hay nhiều cơ sở dữ liệu. Ví dụ :
//Tạo đối tượng SqlDataAdapter
SqlDataAdapter sda = new SqlDataAdapter();

// cung cấp cho sda một SqlCommand và SqlConnection ...
// lấy dữ liệu ...

//tạo đối tượng DataSet mới
DataSet ds = new DataSet("tenDataSet");
Truy cập dữ liệu với ADO.NET Gvhd: Nguyễn Tấn Trần Minh Khang

148

//Đẩy dữ liệu trog sda vào ds bằng hàm Fill();
sda.Fill(ds);
14.5 Trình cung cấp dữ liệu (.NET Data Providers)
.NET Framework hỗ trợ hai trình cung cấp dữ liệu là SQL Server .NET Data
Provider
( dành cho phiên bản SQL Server 7.0 của Microsoft trở lên ) và
OLE DB
.NET Data Provider ( dành cho các hệ quản trị cơ sở dữ liệu khác ) để truy cập vào
cơ sở dữ liệu.
Hình 14-3 So sánh SQL Server .NET Data Provider và the OLE DB .NET Data
Provider


Biến connectString chứa các thông số để kết nối đến cơ sở dữ liệu. Ứng dụng của ta
dùng hệ quản trị cơ sở dữ liệu SQL Server, vì thế để đơn giản ta sẽ để đối số
password là trống, uid là sa, máy chủ server là localhost và tên cơ sở dữ liệu là
NorthWind :
string connectionString =
"server=localhost; uid=sa; pwd=; database=northwind";
Với đối tượng DataAdapter được tạo ở trên, ta sẽ tạo ra một đối tượng DataSet mới
và đẩy dữ liệu vào nó bằng phương thức Fill() của đối tương DataAdapter.
DataSet dataSet = new DataSet( );
DataAdapter.FillDataSet(dataSet,"Customers");
Đối tượng DataSet chứa một tập các DataTable, nhưng ở đây ta chỉ cần lấy dữ liệu
của bảng đầu tiên là “Customers” :
DataTable dataTable = dataSet.Tables[0];
Ta sẽ duyệt qua từng dòng của bảng bằng vòng lặp foreach để lấy về từng DataRow
một, sau đó sẽ truy cập đến trường cần lấy dữ liệu thông qua tên cột, rồi thêm vào
ListBox.
foreach (DataRow dataRow in dataTable.Rows)
{
lbCustomers.Items.Add( dataRow["CompanyName"] +
" (" + dataRow["ContactName"] + ")" );
}
Sau đây là đoạn mã đầy đủ của ứng dụng :
using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
using System.Data.SqlClient;


DataTable dataTable = DataSet.Tables[0];

// duyệt từng dòng để lấy dữ liệu thêm vào ListBox
foreach (DataRow dataRow in dataTable.Rows)
{
lbCustomers.Items.Add(dataRow["CompanyName"] +
" (" + dataRow["ContactName"] + ")" );
}
}

public override void Dispose( )
{
base.Dispose( );
components.Dispose( );
}

private void InitializeComponent( )
{
this.components = new System.ComponentModel.Container();
this.lbCustomers = new System.Windows.Forms.ListBox();
lbCustomers.Location = new System.Drawing.Point(48, 24);
lbCustomers.Size = new System.Drawing.Size(368, 160);
lbCustomers.TabIndex = 0;
this.Text = "ADOFrm1";
this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
this.ClientSize = new System.Drawing.Size(464, 273);
this.Controls.Add(this.lbCustomers);
}

public static void Main(string[] args)

• Đẩy dữ liệu trong bảng dataTable vào ListBox
foreach (DataRow dataRow in dataTable.Rows)
{
lbCustomers.Items.Add(dataRow["CompanyName"] +
" (" + dataRow["ContactName"] + ")" );
}
14.7 Sử dụng trình cung cấp dữ liệu được quản lý
Ở ví dụ trên chúng ta đã khảo sát qua cách truy cập dữ liệu thông qua trình cung cấp
dữ liệu
SQL Server .NET Data Provider
. Trong phần này chúng ta sẽ tiếp tục
khảo sát sang trình cung cấp dữ liệu
OLE DB .NET Data Provider
, với trình cung
cấp dữ liệu này ta có thể kết nối đến bất kỳ hệ quản trị cơ sở dữ liệu nào có hỗ trợ
trình cung cấp dữ liệu OLE DB Providers, cụ thể là Microsoft Access.
So với ứng dụng trên, ta chỉ cần thay đổi một vào dòng mã là có thể hoạt động
được. Đầu tiên là chuỗi kết nối :
string connectionString = "provider=Microsoft.JET.OLEDB.4.0; "
+ "data source = c:\\northwind.mdb";
Truy cập dữ liệu với ADO.NET Gvhd: Nguyễn Tấn Trần Minh Khang

152
Chuỗi trên sẽ kết nối đến cơ sở dữ liệu northwind trên ổ đĩa C.
Kế tiếp ta thay đổi đối tượng DataAdapter từ SqlDataAdapter sang
OleDbDataAdapter
OleDbDataAdapter DataAdapter = new OleDbDataAdapter(
commandString, connectionString);
Chúng ta phải đảm bảo là namespace OleDb được thêm vào ứng dụng :
using System.Data.OleDb;

}
}
14.8 Làm việc với các điều khiển kết buộc dữ liệu
ADO.NET hỗ trợ khá hoàn chỉnh cho các điều khiển kết buộc dữ liệu (Data-
Bound), các điều khiển này sẽ nhận vào một DataSet, sau khi gọi hàm DataBind()
thì dữ liệu sẽ tự động được hiển thị lên điều khiển.
14.8.1 Đẩy dữ liệu vào điều khiển lưới DataGrid
Ví dụ sau sẽ dùng điều khiển lưới DataGrid để thực hiện kết buộc dữ liệu, điều
khiển lưới này được hỗ trợ cho cả ứng dụng Windows Forms và WebForms.
Truy cập dữ liệu với ADO.NET Gvhd: Nguyễn Tấn Trần Minh Khang

153
Trong ứng dụng trước, ta phải duyệt qua từng dòng của đối tượng DataTable để lấy
dữ liệu, sau đó hiển thị chúng lên điều khiển ListBox. Trong ứng dụng này công
việc hiển thị dữ liệu lên điều khiển được thực hiện đơn giản hơn, ta chỉ cần lấy về
đối tượng DataView của DataSet, sau đó gán DataView này cho thuộc tính
DataSource của điều khiển lưới, sau đó gọi hàm DataBind() thì tự động dữ liệu sẽ
được đẩy lên điều khiển lưới dữ liệu.
CustomerDataGrid.DataSource =
DataSet.Tables["Customers"].DefaultView;
Trước tiên ta cần tạo ra đối tượng lưới trên Form bằng cách kéo thả, đặt tên lại cho
điều khiển lưới là CustomerDataGrid. Sau đây là mã hoàn chỉnh của ứng dụng kết
buộc dữ liệu cho điều khiển lưới :
using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
using System.Data.SqlClient;


public override void Dispose( )
{
base.Dispose( );
components.Dispose( );
}
Truy cập dữ liệu với ADO.NET Gvhd: Nguyễn Tấn Trần Minh Khang

154

private void InitializeComponent( )
{
this.components = new System.ComponentModel.Container();
this.CustomerDataGrid = new DataGrid();
CustomerDataGrid.BeginInit();
CustomerDataGrid.Location =
new System.Drawing.Point (8, 24);
CustomerDataGrid.Size = new System.Drawing.Size (656, 224);
CustomerDataGrid.DataMember = "";
CustomerDataGrid.TabIndex = 0;
CustomerDataGrid.Navigate +=
new NavigateEventHandler(this.dataGrid1_Navigate);
this.Text = "ADOFrm3";
this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
this.ClientSize = new System.Drawing.Size (672, 273);
this.Controls.Add (this.CustomerDataGrid);
CustomerDataGrid.EndInit ( );
}

public static void Main(string[] args)


Nhờ tải bản gốc

Tài liệu, ebook tham khảo khác

Music ♫

Copyright: Tài liệu đại học © DMCA.com Protection Status