1. Trang chủ >
  2. Luận Văn - Báo Cáo >
  3. Báo cáo khoa học >

Chương 14 Truy cập dữ liệu với ADO.NET

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (2.57 MB, 369 trang )


C# và .Net Framework



Gvhd: Nguyễn Tấn Trần Minh Khang



14.2 Một số loại kết nối hiện đang sử

dụng

1982 ra đời ODBC driver (Open Database Connectivity) của Microsoft. Chỉ

truy xuất được thông tin quan hệ, không truy xuất được dữ liệu không quan hệ

như : tập tin văn bản, email …Ta phải truy cập ODBC thông qua DSN.

Để truy cập được tất cả Datastore, dùng OLEDB provider thông qua ODBC.

Là vỏ bọc của ODBC hoặc không. OLEDB dễ sử dụng hơn ODBC, nhưng chỉ

có 1 số ít ngôn ngữ có thể hiểu được (C++), vì thế ra đời ADO. OLEDB là

giao diện ở mức lập trình hệ thống để quản lý dữ liệu. OLEDB đơn giản chỉ là

một tập các giao diện COM đóng gói thành các system service để quản trị các

CSDL khác nhau. Gồm 4 đối tượng chính : Datasource, Session, Command,

Rowset.

ADO là một COM, do đó được dùng với bất kỳ ngôn ngữ nào tương thích với

COM. ADO không độc lập OS, nhưng độc lập ngôn ngữ : C++,VB,

JavaScript, VBScript …Là vỏ bọc của OLEDB và ADO gồm 3 đối tượng

chính : Connection, Command, Recordset.

Remote Data Services ( RDS ) của Microsoft cho phép dùng ADO thông qua

các giao thức HTTP, HTTPS và DCOM để truy cập dữ liệu qua Web.

Microsoft Data Access Components (MDAC) là tổ hợp của ODBC, OLEDB,

ADO và cả RDS.

Ta có thể kết nối dữ liệu bằng một trong các cách: dùng ODBC driver (DSN),

dùng OLEDB thông qua ODBC hoặc OLEDB không thông qua ODBC.

14.3 Kiến trúc ADO.NET

ADO.NET được chia ra làm hai phần chính rõ rệt, được thể hiện qua hình

Hình 14-27 Kiến trúc ADO.NET



192



C# và .Net Framework



Gvhd: Nguyễn Tấn Trần Minh Khang



D

DataSet là thành phần chính cho đặc trưng kết nối không liên tục của kiến

trúc 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 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.



193



C# và .Net Framework



Gvhd: Nguyễn Tấn Trần Minh Khang



14.4.1 Mô hình đối tượng của Dataset

Hình 14-28 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.

14.4.2 Đối tượng DataTable và DataColumn

Ta có thể viết mã C# để tạo ra đối tượng DataTable hay nhận về từ kết quả

của câu truy vấn đến cơ sở dữ liệu. DataTable có một số thuộc tính dùng

chung ( public ) như thuộc tính Columns, từ thuộc tính này ta có thể truy cập

đến đối tượng DataColumnsCollection thông qua chỉ mục hay tên của cột

để nhận về các đối tượng DataColumn thích hợp, mỗi DataColumn tương

ứng với một cột trong một bảng dữ liệu. Ví dụ :

DataTable dt = new DataTable("tenBang");

DataColumn dc = dt.Columns["tenCot"];

14.4.3 Đối tượng DataRelation

Ngoài tập các đối tượng DataTable được truy cập thông qua thuộc tính

Tables, DataSet còn có một thuộc tính Relations. Thuộc tính này dùng để

truy cập đến đối tượng DataRelationCollection thông qua chỉ mục hay tên

của quan hệ và sẽ trả về đối tượng DataRelation tương ứng. Ví dụ :

DataSet ds = new DataSet("tenDataSet");



194



C# và .Net Framework



Gvhd: Nguyễn Tấn Trần Minh Khang



DataRelation dre = ds.Relations["tenQuanHe"];

14.4.4 Các bản ghi ( Rows )

Tương tự như thuộc tính Columns của đối tượng DataTable, để truy cập đến

các dòng ta cũng có thuộc tính Rows. ADO. NET không đưa ra khái niệm

RecordSet, thay vào đó để duyệt qua các dòng ( Row ), ta có thể truy cập các

dòng thông qua thuộc tính Rows bằng vòng lặp foreach.

14.4.5 Đối tượng SqlConnection và SqlCommand

Đối tượng SqlConnection đại diện cho một kết nối đến cơ sở dữ liệu, đối

tượng này có thể được dùng chung cho các đối tượng SqlCommand khác

nhau. Đối tượng SqlCommand cho phép thực hiện một câu lệnh truy vấn trực

tiếp : như SELECT, UPDATE hay DELETE hay gọi một thủ tục (Store

Procedure) từ cơ sở dữ liệu.

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");

//Đẩ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à



195



C# và .Net Framework



Gvhd: Nguyễn Tấn Trần Minh Khang



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-29 So sánh SQL Server .NET Data Provider và the OLE DB

.NET Data Provider



SQL Server .NET Data Provider có các đặc điểm :

• Dùng nghi thức riêng để truy cập cơ sở dữ liệu

• Truy xuất dữ liệu sẽ nhanh hơn và hiệu quả hơn do không phải thông qua

lớp OLE DB Provider hay ODBC

• Chỉ được dùng với hệ quản trị cơ sở dữ liệu SQL Server 7.0 trở lên.

• Được Mircrosoft hỗ trợ khá hoàn chỉnh.

OLE DB .NET Data Provider có các đặc điểm :

• Phải thông qua 2 lớp vì thế sẽ chậm hơn

• Thực hiện được các dịch vụ “Connection Pool”

• Có thể truy cập vào mọi Datasource có hỗ trợ OLE DB Provider thích

hợp

14.6 Khởi sự với ADO.NET

Để có thể hiểu rõ được ADO.NET, ngoài lý thuyết ra, chúng ta sẽ khảo sát chi

tiết về cách chúng hoạt động ra bằng mã lệnh cụ thể.

Ví dụ Windows Form dưới đây sẽ dùng một ListBox để lấy dữ liệu từ bảng

Custommers trong cơ sở dữ liệu NorthWind.

Đầu tiên ta sẽ tạo ra đối tượng DataAdapter :

SqlDataAdapter DataAdapter = new SqlDataAdapter(

commandString, connectionString);

Hàm khởi tạo của đối tượng này gồm hai tham số commandString và

connectionString. commandString là chuỗi chứa câu lệnh truy vấn trên dữ liệu

mà ta muốn nhận về :

string commandString =



196



C# và .Net Framework



Gvhd: Nguyễn Tấn Trần Minh Khang



"Select CompanyName, ContactName from

Customers";

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;

namespace ProgrammingCSharpWinForm

{

public class ADOForm1 :

System.Windows.Forms.Form



197



C# và .Net Framework



Gvhd: Nguyễn Tấn Trần Minh Khang



{

private System.ComponentModel.Container

components;

private System.Windows.Forms.ListBox

lbCustomers;

public ADOForm1( )

{

InitializeComponent( );

// kết nối đến máy chủ, cơ sở dữ liệu

northwind

string connectionString =

"server=localhost; uid=sa; pwd=;

database=northwind";

// lấy các dòng dữ liệu từ bảng Customers

string commandString =

"Select CompanyName, ContactName from

Customers";

// tạo ra đối tượng DataAdapter và DataSet

SqlDataAdapter DataAdapter =

new SqlDataAdapter(commandString,

connectionString);

DataSet DataSet = new DataSet( );

// đẩy dữ liệu vào DataSet

DataAdapter.Fill(DataSet,"Customers");

// lấy về một bảng dữ liệu

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"] + ")" );



198



C# và .Net Framework



Gvhd: Nguyễn Tấn Trần Minh Khang



}

}

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)

{

Application.Run(new ADOForm1( ));

}



}

Chỉ với một số dòng mã ta đã có thể lấy dữ liệu và hiện thị trong hộp

ListBox :



199



C# và .Net Framework



Gvhd: Nguyễn Tấn Trần Minh Khang



Hình 14-30 Kết xuất của ví dụ trên.



Để hoàn chỉnh giao tác trên, ta cần thực hiện tám dòng mã chính :

• Tạo ra chuỗi kết nối vào cơ sở dữ liệu

string connectionString =

"server=myServer; uid=sa; pwd=;

database=northwind";

• Tạo câu lênh truy vấn chọn dữ liệu

string commandString =

"Select CompanyName, ContactName from

Customers";

• Tạo đối tượng DataAdapter và chuyển cho nó chuỗi truy vấn và kết nối

SqlDataAdapter DataAdapter = new SqlDataAdapter(

commandString, connectionString);

• Tạo đối tượng DataSet mới

DataSet dataSet = new DataSet( );

• Đẩy bảng dữ liệu Customers lấy từ DataAdapter vào dataSet

DataAdapter.Fill(dataSet,"Customers");

• Trích đối tượng DataTable từ dataSet trên

DataTable dataTable = DataSet.Tables[0];

• Đẩy dữ liệu trong bảng dataTable vào ListBox

foreach (DataRow dataRow in dataTable.Rows)

{

lbCustomers.Items.Add(dataRow["CompanyName"] +

" (" + dataRow["ContactName"] + ")" );

}



200



C# và .Net Framework



Gvhd: Nguyễn Tấn Trần Minh Khang



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";

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;

Phần mã còn lại thì tương tự như ứng dụng trên, sau đây sẽ trích ra một đoạn

mã chính phục vụ cho việc kết nối theo cách này :

public ADOForm1( )

{

InitializeComponent( );

// chuỗi kết nối đến cơ sở dữ liệu

string connectionString =

"provider=Microsoft.JET.OLEDB.4.0;"

+ "data source =

c:\\nwind.mdb";

// chuỗi truy vấn dữ liệu

string commandString =

"Select CompanyName, ContactName from

Customers";



201



C# và .Net Framework



Gvhd: Nguyễn Tấn Trần Minh Khang



// tạo đối tượng OleDbDataAdapter và DataSet

mới

OleDbDataAdapter DataAdapter = new

OleDbDataAdapter(

commandString, connectionString);

DataSet dataSet = new DataSet( );

// đẩy dữ liệu vào dataSet

DataAdapter.Fill(DataSet,"Customers");

// lây về bảng dữ liệu Customers

DataTable dataTable = DataSet.Tables[0];



+



// duyệt qua từng dòng dữ liệu

foreach (DataRow dataRow in dataTable.Rows)

{

lbCustomers.Items.Add(dataRow["CompanyName"]

}



" (" + dataRow["ContactName"] + ")" );



}

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 (DataBound), 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.

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 =



202



Xem Thêm
Tải bản đầy đủ (.doc) (369 trang)

×