Truy xu t c s d li u b ng ado
Download
1 / 53

TRUY XUẤT CƠ SỞ DỮ LIỆU BẰNG ADO. - PowerPoint PPT Presentation


  • 137 Views
  • Uploaded on

I. Thư viện ADO và ODBC II. Sử dụng các đối tượng Connection và Recordset. TRUY XUẤT CƠ SỞ DỮ LIỆU BẰNG ADO. Giới thiệu.

loader
I am the owner, or an agent authorized to act on behalf of the owner, of the copyrighted work described.
capcha
Download Presentation

PowerPoint Slideshow about ' TRUY XUẤT CƠ SỞ DỮ LIỆU BẰNG ADO.' - garnet


An Image/Link below is provided (as is) to download presentation

Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author.While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server.


- - - - - - - - - - - - - - - - - - - - - - - - - - E N D - - - - - - - - - - - - - - - - - - - - - - - - - -
Presentation Transcript
Truy xu t c s d li u b ng ado

I. Thư viện ADO và ODBC

II. Sử dụng các đối tượng Connection và Recordset

TRUY XUẤT CƠ SỞ DỮ LIỆU BẰNG ADO.


Gi i thi u
Giới thiệu

Hiện nay hầu các web site từ đơn giản cho đến các web site phục vụ thương mại điện tử đều có sử dụng cơ sở dữ liệu (CSDL) để lưu trữ thông tin. Chính vì thế việc viết các trang web có truy xuất tới database là một trong những yêu cầu bắt buộc với những người lập trình web.

Nội dung của chương này đề cập tới các kỹ thuật lập trình với CSDL bằng ASP, sử dụng thư viện ADO.


I th vi n ado v odbc

Script

ADO(OLE-DB)

ODBC

Database

I. Thư viện ADO và ODBC

Để cung cấp khả năng làm việc với CSDL cho các trang web, ASP sử dụng thư viện COM có tên là ADO (ActiveX Data Objects). ADO là một bộ các đối tượng thực hiện các thao tác cơ bản để làm việc với CSDL. Các đối tượng của ADO có thể được sử dụng bởi các lệnh script của trang ASP một cách khá dễ dàng, điều này làm cho việc xây dựng các ứng dụng CSDL là một trong các đặc điểm ưu việt của ASP.

Cấu trúc lập trình ASP với ADO được thể hiện như sau:

Nhờ có ODBC (Open DataBase Connectivity) cung cấp cách thức truy xuất tới các cấu trúc vật lý của các loại DBMS khác nhau mà người lập trình với ADO chỉ cần biết đến lược đồ trừu tượng của cơ sở dữ liệu cần truy xuất. Hay nói cách khác, ADO và ODBC cung cấp cho người viết kịch bản .asp khả năng truy xuất độc lập với cơ sở dữ liệu vật lý.


1 c c c ch t o k t n i t i csdl
1.Các cách tạo kết nối tới CSDL

Kịch bản sử dụng ADO có thể kết nối tới CSDL (MS-Access) bằng các cách sau đây:

Sử dụng một danh hiệu gọi là DSN (Data Source Name).

  • Với các lệnh script trong trang .asp thì DSN được coi như danh hiệu đại diện cho CSDL cần làm việc.

  • Cách tạo danh hiệu DNS (cho các cơ sở dữ liệu Access) như sau:

  • Khởi động chương trình: Control Panel/ODBC trên server.

  • Chọn SystemDSN

  • Chọn Add.

  • Chọn MicroSoft Access Driver(*.mdb), bấm finish (Chú ý rằng: ở bước này có thể chọn một driver khác cho các DBMS mà hệ thống hỗ trợ, để kết nối tới cơ sở dữ liệu của DBMS đó. Ví dụ như: SQL server, Oracle…)

  • Điền tên Data source name: MYDATA

  • Bấm Select để chọn file mydb.mdb(Hoặc chọn Database nếu kết nối tới các DBMS khác)

  • Bấm OK, kết thúc

  • Sau khi đã có một DNS, việc truy xuất tới cơ sở dữ liệu mà DNS đó đại diện được thực hiện khà dễ dàng thông qua các đối tượng mà thư viện ADO cung cấp.


S d ng file dsn
Sử dụng file DSN

File DSN là một file đặc tả các thông số cho kết nối thông qua ODBC. File này là một file văn bản trơn, có nội dung như sau:

[ODBC]

DRIVER=Microsoft Access Driver (*.mdb)

ReadOnly=0

UserCommitSync=Yes

Threads=3

SafeTransactions=0

PageTimeout=5

FILL=MS Access

DriverId=25

MaxScanRows=8

axBufferSize=512

ImplicitCommitSync=

Thay vì phải sử dụng danh hiệu DSN như ở trên, khi thực hiện kết nối người lập trình chỉ cần tạo file DSN và trong kịch bản xác định việc sử dụng file này. Phương pháp sử dụng file DSN có lợi điểm là: Người lập trình không cần phải khai báo DSN tường minh bằng chương trình ODBC trên server.


S d ng ms oledb provider
Sử dụng MS-OLEDB provider

Microsoft OLEDB provider cho phép có thể đặc tả các tham số để kết nối tới bất kỳ một CSDL nào thông qua ODBC.

Cú pháp của chuỗi đặc tả kết nối tới CSDL MS-Access, không có khai báo DSN tường minh như sau:

“DBQ=Duong_dan_toi_file_mdb;Driver={Microsoft Access Driver (*.mdb)};


2 c c i t ng c a ado
2. Các đối tượng của ADO

ADO cung cấp cho người lập trình script các đối tượng sau:


3 s th b c c a c c i t ng ado

Đối tượng Connection

Đối tượng Recordset

Tập hợp Fields

Đối tượng Command

Tập hợp Parameters

Tập hợp Errors

3. Sơ đồ thứ bậc của các đối tượng ADO

Khi sử dụng một đối tượng ADO, cũng giống như việc sử dụng các component khác, chúng ta phải tạo các biến thể hiện của chúng. Cú pháp chung cho việc tạo thể hiện là:

Tên_ThểHiện=Server.CreateObject(“ADODB.Tên_ĐốiTượng”);

Ví dụ:

Tạo đối tượng Connection có tên là Conn:Conn=Server.CreateObject(“ADODB.Connection”);

Tạo đối tượng Recordset có tên là Rs:Rs=Server.CreateObject(“ADODB.Recordset”);

Tạo đối tượng Command có tên là Comm:Comm=Server.CreateObject(“ADODB.Command”);


Ii s d ng c c i t ng connection v recordset
II. Sử dụng các đối tượng Connection và Recordset

Trong phần này, chúng ta sẽ sử dụng các đối tượng Connection, Recordset để tạo các trang .asp có khả năng thực hiện các thao tác: cập nhật, thêm, xóa và liệt kệ các record trong một cơ sở dữ liệu .mdb


1 c s d li u v d
1. Cơ sở dữ liệu ví dụ Recordset

Giả sử có một cơ sở dữ liệu (đơn giản) lưu trữ thông tin về các mặt hàng mà một công ty muốn trình bày trên web site của họ. Luợc đồ của CSDL này được miêu tả như sau:

1. MAT_HANG(MaMH, TenMH, GiaMH, TinhNang, MaLoai, SoLGH, DonVi, MaTien)

Ý nghĩa: MAT_HANG lưu trữ các mặt hàng có trong kho. Mỗi mặt hàng gồm có các thông tin như: Mã mặt hàng (MaMH, Autonumber), Tên mặt hàng (TenMH, text), Giá thành mặt hàng cho một đơn vị tính (GiaMH, float), mô tả tính năng (TinhNang, text), Mã số loại hàng (MaLoai, int), Số lượng hàng còn lại trong kho (SoLGH, int), mã số đơn vị tính (DonVi, int), mã loại tiền giá bán (MaTien, int)


2. LOAI_HANG( Recordset MaLoai, TenLoai)Ý nghĩa: LOAI_HANG là danh sách các chủng loại hàng có trong kho. Mỗi loại hàng gồm có các thông tin: Mã số loại (MaLoai, Autonumber), Tên chủng loại (TenLoai, text).

3. HANG_SX(MaHSX, TenHangSX)Ý nghĩa: Lưu trữ danh sách các hãng sản xuất có cung cấp hàng cho công ty. Một hãng sản xuất gồm có các thông tin: Mã số hãng sản xuất (MaHSX, autonumber), tên hãng sản xuất (TenHSX, text)

4. CUNG_CAP(MaMH, MaHSX)

Ý nghĩa: Xác định các mặt hàng do các hãng sản xuất cung cấp cho công ty. Bao gồm: Mã mặt hàng(MaMH, int), mã số hãng cung cấp (MaHSX, int)

5. DON_VI(DonVi, TenDV)

Ý nghĩa: Là danh sách các loại đơn vị tính được sử dụng. Bao gồm: mã đơn vị (DonVi, Autonumber), tên đơn vị tính (TenDV, text).

6. LOAI_TIEN(MaTien, TenLoai)

Ý nghĩa: Là danh sách các loại đơn vị tiền tệ được sử dụng trong bảng giá. Bao gồm: mã đơn vị tiền tệ (Matien, Autonumber), tên loại tiền (TenLoai, text).

Lược đồ trên được cài đặt bằng MS-Accsess với tên là mydb.mdb


Qu tr nh l m vi c v i csdl trong m t trang asp
Quá trình làm việc với CSDL trong một trang ASP. Recordset

  • Gồm có ba bước:

  • Thiết lập kết nối tới CSDL cần làm việc.

  • Thực hiện các thao tác với CSDL thông qua các truy vấn SQL hoặc các đối tượng ADO.

  • Đóng kết nối.


2 i t ng connection
2. Đối tượng Connection Recordset

Đối tượng Connection được sử dụng để tạo, duy trì và đóng một cầu nối từ chương trình tới CSDL thông qua phương thức ODBC. Đối tượng Connection cũng dùng để thực hiện các thao tác quản lý transaction và thực hiện lệnh truy vấn SQL. Phần này sẽ hướng dẫn sử dụng đối tượng Connection để: Tạo và duy trì cầu nối ODBC, đóng cầu nối và thực hiện lệnh truy vấn SQL.

Thiết lập kết nối

Sau khi đã có một thể hiện của đối tượng Connection, ta có thể thiết lập kết nối tới CSDL bằng phương thức Open, với cú pháp như sau:

TênConnection.Open([ConnectionString][,UserID][,Password]);

Trong đó:

UserID: tên tài khoản được phép sử dụng CSDL. Tham số này là tùy chọn.

Password: Mật khẩu của tài khoản UserID. Tham số này là tùy chọn.

ConnectionString: Tham số này có thể không có, nếu đã khởi động giá trị cho thuộc tính ConnectionString của đối tượng Connection. Giá trị của tham số này (của thuộc tính) là một chuỗi đặc tả thông tin của kết nối. Chuỗi này có thể là một tên DSN hoặc một chuỗi xác định cụ thể các thông tin kết nối.


V d 1
Ví dụ 1 Recordset :

Tạo kết nối tới CSDL mydb.mdb thông qua ODBC, sử dụng tên DSN, bao gồm các bước sau:

Khai báo ODBC Data Source Name.

Sau khi khai bao, giả sử chúng ta có một DSN tên là: “MYDATA”.

Khai báo này chỉ thực hiện một lần, khi đưa cơ sở dữ liệu mới lên server.

Mở kết nối. Có thể thực hiện bằng hai cách sau:

<%

Conn=Server.CreateObject(“ADODB.Connection”);

Conn.Open(“MYDATA”);

%>

Hoặc:

<%

Conn=Server.CreateObject(“ADODB.Connection”);

Conn.ConnectionString=”MYDATA”;

Conn.Open();

%>


V d 2
Ví dụ 2: Recordset

Tạo kết nối tới CSDL mydb.mdb thông qua ODBC bằng cách sử dụng file DSN.

Trong ví dụ 1, chúng ta nhận thấy, mỗi khi đưa một cơ sở dữ liệu mới lên server, ta phải thực hiện khai báo DSN. Công việc khai báo này thường do người quản trị thực hiện. Một cách khác để không phải khai báo tên DSN tường minh như trên là sử dụng file DSN, file này sẽ chứa các thông tin cần thiết cho việc kết nối.

Các bước thực hiện:


Bước 1. Recordset Tạo file DSN (mydata.dsn), file này có nội dung giống nhau cho các kết nối tới cơ sở dữ liệu Access. Có nội dung như sau:

-----mydata.dsn---------

[ODBC]

DRIVER=Microsoft Access Driver (*.mdb)

ReadOnly=0

UserCommitSync=Yes

Threads=3

SafeTransactions=0

PageTimeout=5

FILL=MS Access

DriverId=25

MaxScanRows=8

axBufferSize=512

ImplicitCommitSync=


Bước 2. Thực hiện kết nối. Recordset

<%

Conn=Server.CreateObject("ADODB.Connection");

DBPath=Server.MapPath("mydb.mdb");

DSNPath=Server.MapPath("mydata.dsn");

Conn.ConnectionString="fileDSN="+DSNPath+";DBQ="+DBPath;

Conn.Open();

%>


V d 3
Ví dụ 3: Recordset

Tạo kết nối tới CSDL mydb.mdb thông qua ODBC bằng cách đặc tả chuỗi ConnectionString.

<%

DBPath = Server.MapPath("mydb.mdb");

Conn = Server.CreateObject("ADODB.Connection");

ConString=’’DBQ=’’+DBPath +’’;Driver={Microsoft Access Driver (*.mdb)};’’;

Conn.ConnectionString=ConString;Conn.Open();%>


<% Recordset

var sqlconnection;

sqlconnection = Server.MapPath(“MyDB.MDB");

var conn = Server.CreateObject("ADODB.Connection");

conn.ConnectionString = " Provider = Microsoft.Jet.OLEDB.4.0; data source = '"+ sqlconnection +"' ";

conn.Open();

%>


Ng k t n i
Đóng kết nối. Recordset

Khi đã có một kết nối tới CSDL, chúng ta có thể thực hiện các thao tác dựa trên kết nối đó. Đối tượng Connection sẽ duy trì kết nối cho tới khi, hàm Close() được thực thi, hoặc sự thực thi đã rời khỏi tầm vực của biến thể hiện đối tượng Connction.

Cú pháp đóng kết nối như sau:

Tên_Connection.Close();

Ví dụ 4: Đóng kết nối Conn.

<%

Conn.Close();

%>

Chú ý: Khi thực hiện đóng một kết nối, thì tất cả các đối tượng ADO khác sử dụng kết nối này đều chấm dứt hoạt động.


Th c hi n c u truy v n sql
Thực hiện câu truy vấn SQL. Recordset

Đối tượng Connection cung cấp phương thức Execute cho việc thực hiện một truy vấn SQL tới CSDL. Cú pháp sử dụng phương thức này như sau:

Cho trường hợp các truy vấn lấy dữ liệu:

Tên_Recordset=ConnObject.Execute(CâuLệnhSQL,SốRecords,LoạiLênh);

Cho trường hợp các truy vấn thay đổi nội dung CSDL

ConnObject.Execute(CâuLệnhSQL,SốRecords,LoạiLênh);

Trong đó

CâuLệnhSQL: là một chuỗi thể hiện câu lệnh SQL, hoặc tên bảng hoặc tên thủ tục (stored-procedure)…

LoạiLệnh: là hằng số, xác định CâuLệngSQl, cụ thể là câu truy vấn hay tên bảng hay tên thủ tục…. Các giá trị tương ứng là:

0: Câu truy vấn

1: Tên bảng

2: tên stored-procedure

3: Là chuỗi đặc tả thực thi chưa biết.

Giá trị mặc nhiên là 0.

SốRecord: Là một biến nguyên, được khởi động giá trị là 0, trước khi thực thi. Sau khi thực thi, có giá trị là số Record mà lệnh SQL tác động tới.


V d 5
Ví dụ 5: Recordset

Đoạn chương trình chèn một record vào bảng LOAI_HANG trong CSDL.

<%

DBPath = Server.MapPath("mydb.mdb");

Conn = Server.CreateObject("ADODB.Connection");

ConString="DBQ="+DBPath +";Driver={Microsoft Access Driver (*.mdb)}; ’’;

Conn.ConnectionString=ConString;Conn.Open();SQL=’’ insert into LOAI_HANG(TenLoai) values (‘Noi Com Dien’)’’;

Conn.Execute(SQL);

Conn.Close();

%>

Chú ý: Vì thuộc tính MaLoai có kiểu là autonumber, nên khi thực hiện insert, ta không điền giá trị cho thuộc tính này.


Ví dụ 6: Recordset Tạo trang web có tên là LoaiHang.htm cung cấp form để điền tên loại hàng, sau khi submit sẽ gửi dữ liệu tới trang insertLH.asp, trang này thực hiện thêm tên loại hàng nhận được vào CSDL.

<!---LoaiHang.htm -- >

<HTML>

<HEAD><TITLE>Insert Loai_Hang</TITLE></HEAD>

<BODY>

Please, type the value of TenLoai:<BR>

<FORM ACTION="insertLH.asp" METHOD="Post">

TenLoai:<INPUT NAME="TenLoai" TYPE="text">

<INPUT NAME="Sbmt" TYPE="submit"

VALUE="Insert toLOAI_HANG">

<INPUT NAME="Reset" TYPE="reset" VALUE="Clear">

</FORM>

</BODY>

</HTML>


V d 6 tt

<!—insertLH.asp -- > Recordset

<%@ Language="Jscript" %>

<%

TenLoai=""+Request("TenLoai");

if (TenLoai !="undefined" && TenLoai != "") {

SQL="INSERT INTO LOAI_HANG(TenLoai) values ('" +TenLoai+ "')";

DBPath = Server.MapPath("mydb.mdb");

Conn = Server.CreateObject("ADODB.Connection");

ConString="DBQ="+DBPath+";Driver={Microsoft Access Driver (*.mdb)}; ";

Conn.ConnectionString=ConString;

Conn.Open();

Conn.Execute(SQL);

Conn.Close();

}

Response.redirect("loaihang.htm");

%>

Ví dụ 6 (tt)


3 i t ng recordset
3. Đối tượng Recordset Recordset

Sử dụng đối tượng Connection như trong phần trên ta đã có thể thực hiện các thao tác chèn, xóa và sửa chữa dữ liệu trong CSDL bằng các câu lệnh SQL. Việc liệt kê giá trị của các record trong CSDL sẽ sử dụng các truy vấn dạng SELECT, kết quả của một truy vấn SELECT sẽ trả về là một tập hợp các record theo yêu cầu của truy vấn. Để có thể dễ dàng duyệt, hiển thị các record được trả về từ một truy vấn SELECT, ADO cung cấp đối tượng Recordset là một kiểu danh sách lưu trữ tập các record này.

Đối tượng Recordset thể hiện một cursor-list lưu trữ tập các record nhận về từ cơ sở dữ liệu sau khi thực hiện một truy vấn SQL dạng SELECT. Recordset có thể được coi là một bảng ảo và có một con trỏ luận lý (tương tự như khái niệm con trỏ file) để dễ dàng duyệt các record trong danh sách.

Recordset làm việc với cơ sở dữ liệu dựa trên một cầu nối đã được mở (Actived Connection object).


H nh nh minh h a c u tr c cursor list c a recordset

Con trỏ Recordset

Record 1

Record 2

Trang luận lý

Record 3

. . . . . . . . . . . .

Record i

Record i+1

Record N

Hình ảnh minh họa cấu trúc cursor-list của Recordset.

Sau khi khởi tạo đối tượng Recordset thì danh sách records là rỗng. Danh sách Records được xác lập sau khi thực hiện một truy vấn tới cơ sở dữ liệu và con trỏ luận lý định vị tại Record đầu tiên.


M t s thu c t nh v ph ng th c
Một số thuộc tính và phương thức Recordset

  • Để lấy giá trị của một thuộc tính ở record hiện tại (con trỏ luận lý đang trỏ tới), sử dụng cú pháp sau: Ten_Recordset(“Ten_Thuoc_Tinh”)

  • Để duyệt một Recordset thường sử dụng các thuộc tính và phương thức sau:

  • EOF : Trả về giá trị false nếu con trỏ luận lý đang trỏ vào một record trong Recorset. Trả về giá trị true nếu con trỏ luận lý đã đi qua record cuối cùng trong danh sách.

  • BOF: Trả về giá trị trả về giá trị true nếu con trỏ đứng trước record đầu tiên. Ngược lại trả về giá trị false.

  • MoveNext(): Phương thức này sử dụng để dịch chuyển con trỏ luận lý tiến tới một vị trí.

  • Ngoài ra, để đóng một Recordset và làm cho nó trở về trạng thái rỗng, chúng ta sử dụng phương thức Close().


Gi i thu t duy t truy v n v recordset
Giải thuật duyệt truy vấn và Recordset. Recordset

  • Tạo thể hiện của đối tượng Connection và Recordset.

  • Thực hiện kết nối tới CSDL thông qua ODBC

  • Thực hiện truy vấn và lưu kết quả và lưu kết quả vào Recordset.

  • Sử dụng cú pháp:

  • RecordsetObj=ConnectionObj.Execute(SQL);

  • Hoặc sử dụng phương thức Open() của đối tượng Recordset

  • Duyệt Recordset để trình bày dữ liệu kết quả.

  • Thường sử dụng vòng lặp như sau:

  • while ( ! RecordsetObj.EOF) {

  • Trình bày nội dung record hiện tại: RecordsetObj(“Ten_Field”);

  • Di chuyển tới record kế tiếp: RecordsetObj.MoveNext();

  • }

  • Đóng Recordset.

  • Theo cú pháp:

  • RecordsetObj.Close();


Ví dụ 1 Recordset : Trang lietkeLH.Asp thực hiện việc liệt kê danh sách các tên loại hàng có trong bảng LOAI_HANG. Danh sách này được thể hiện trong một select list.

<!-- lietkeLH.Asp -->

<%@ Language="Jscript" %>

<%

DBPath = Server.MapPath("mydb.mdb");

Conn = Server.CreateObject("ADODB.Connection");

ConString="DBQ="+DBPath +";Driver={Microsoft Access Driver (*.mdb)}; ";

Conn.ConnectionString=ConString;

Conn.Open();

Rs=Server.CreateObject("ADODB.Recordset");

SQL="Select * from LOAI_HANG";

Rs=Conn.Execute(SQL);

%>


V d 1 tt
Ví dụ 1 (tt) Recordset

<HTML>

<HEAD><TITLE>Các chủng loại hàng</TITLE></HEAD>

<BODY>

<FORM>

<SELECT NAME="TenLoai">

<% while ( ! Rs.EOF ) { %>

<OPTION Value="<%=Rs("MaLoai") %>" ><%=Rs("TenLoai") %>

<%

Rs.MoveNext();

}

%>

</SELECT>

</FORM>

<%

Rs.Close();

Conn.Close();

%>

</BODY>

</HTML>


V d 2 trang suatenlh asp th c hi n c ng vi c s a t n lo i h ng c trong csdl
Ví dụ 2 Recordset : Trang suaTENLH.asp thực hiện công việc sửa tên loại hàng đã có trong CSDL.

<!-- suaTENLH.Asp -->

<%@ Language="Jscript" %>

<%

DBPath = Server.MapPath("mydb.mdb");

Conn = Server.CreateObject("ADODB.Connection");

ConString="DBQ="+DBPath +";Driver={Microsoft Access Driver (*.mdb)}; ";

Conn.ConnectionString=ConString;

Conn.Open();

TenLH=""+Request("TenLH");

Maloai=""+Request("MaLoai");

if (TenLH != "undefined" && Maloai != "undefined" && TenLH!="") {

updSql="UPDATE LOAI_HANG SET LOAI_HANG.tenLoai = '"+TenLH+"' WHERE Maloai="+Maloai;

Conn.Execute(updSql);

}

Rs=Server.CreateObject("ADODB.Recordset");

SQL="Select * from LOAI_HANG";

Rs=Conn.Execute(SQL);

%>


V d 2 tt
Ví dụ 2(tt) Recordset

<HTML>

<HEAD><TITLE>Các chủng loại hàng</TITLE></HEAD>

<BODY>

<FORM Name="EDIT" Action="suaTENLH.asp" METHOD=POST>

Chọn loại hàng sẽ sửa tên:

<SELECT NAME="MaLoai">

<% while ( ! Rs.EOF ) { %>

<OPTION Value="<%=Rs("MaLoai") %>" ><%=Rs("TenLoai") %>

<%

Rs.MoveNext();

}

%>

</SELECT><BR>

Nhập tên mới cho loại hàng:<INPUT Name="TenLH" Type="Text" ><BR>

<INPUT Name="Button1" Type=Submit Value="Cap Nhat Ten Moi">

<INPUT Name="Button2" Type=Reset Value="Nhap Lai Ten">

</FORM>

<%

Rs.Close();

Conn.Close();

%>

</BODY>

</HTML>


Vi dụ 3: Recordset Trang nhapMH.asp cung cấp form cho phép thêm một mặt hàng mới vào CSDL. (Ví dụ này chưa phần kiểm tra tính hợp lệ của kiểu dữ liệu)

<!-- NhapMH.Asp -->

<%@ Language="Jscript" %>

<%

DBPath = Server.MapPath("mydb.mdb");

Conn = Server.CreateObject("ADODB.Connection");

ConString="DBQ="+DBPath+";Driver={Microsoft Access Driver (*.mdb)}; "

Conn.ConnectionString=ConString;

Conn.Open();

// thực hiện cập nhật.

TenMH=""+Request("TenMH");

if (TenMH !="undefined" && TenMH !="") {

chkName="SELECT * FROM MAT_HANG WHERE TenMH='"+TenMH+"'";

chkRs=Server.CreateObject("ADODB.Recordset");

chkRs=Conn.Execute(chkName);

if (chkRs.BOF) { // Chưa có tên mặt hàng đó

LoaiMH=""+Request("LoaiMH");

MaTien=""+Request("MaTien");

DonVi=""+Request("DonVi");

SoLGH=""+Request("SoLGH");

TinhNang=""+Request("TinhNang");

GiaMH=""+Request("GiaMH");


V d 3 tt
Ví dụ 3 (tt) Recordset

insertSQL="INSERT INTO MAT_HANG (TenMH, GiaMH, MaLoai, MaTien, DonVi, TinhNang, ";

insertSQL+=" SoLHG ) VALUES ('"+ TenMH +"'," + GiaMH +","+ LoaiMH+","+ MaTien+",";

insertSQL+=DonVi+",'"+ TinhNang+"',"+ SoLGH+")";

Conn.Execute(insertSQL);

}

}

// Thực hiện lấy dữ liệu để hiển thị trong form.

Rs=Server.CreateObject("ADODB.Recordset");

Rs1=Server.CreateObject("ADODB.Recordset");

Rs2=Server.CreateObject("ADODB.Recordset");

LH="SELECT * FROM LOAI_HANG";

Rs=Conn.Execute(LH);

DV="SELECT * FROM DON_VI";

Rs1=Conn.Execute(DV);

TIEN="SELECT * FROM LOAI_TIEN";

Rs2=Conn.Execute(TIEN);

%>


V d 3 tt1
Ví dụ 3(tt) Recordset

<HTML><HEAD>

<TITLE>FORM nhập mặt hàng</TITLE></HEAD>

<BODY>

<FORM Name="NhapMH" Action="nhapMH.Asp" Method=POST>

Tên hàng: <INPUT NAME="TenMH" TYPE="text"><BR>

Loai hàng:<SELECT NAME="LoaiMH">

<% while ( ! Rs.EOF ) { %>

<OPTION Value="<%=Rs("MaLoai") %>" ><%=Rs("TenLoai") %>

<%

Rs.MoveNext();

}

Rs.Close();

%>

</SELECT>

Giá: <INPUT NAME="GiaMH" TYPE="text"><BR>

Loai tien:<SELECT NAME="MaTien">

<% while ( ! Rs2.EOF ) { %>

<OPTION Value="<%=Rs2("MaTien") %>" ><%=Rs2("TenLoai") %>

<%

Rs2.MoveNext();

}

Rs2.Close();

%>


V d 3 tt2
Ví dụ 3(tt) Recordset

</SELECT><BR>

Mô tả tính năng: <INPUT NAME="TinhNang" TYPE="text"><BR>

Số lượng: <INPUT NAME="SoLGH" TYPE="text"><BR>

Don vi tinh:<SELECT NAME="DonVi">

<% while ( ! Rs1.EOF ) { %>

<OPTION Value="<%=Rs1("DonVi") %>" ><%=Rs1("TenDV") %>

<%

Rs1.MoveNext();

}

Rs1.Close();

%>

</SELECT>

<INPUT NAME="Them" TYPE="submit" VALUE="Them MH">

<INPUT NAME="Nhap lai" TYPE="reset" VALUE="Them MH">

</FORM>

<%

Conn.Close();

%>

</BODY>

</HTML>


Ví dụ 4. Recordset Trang chonLH.asp sẽ cho phép chọn một loại hàng trong danh sách rồi sau đó liệt kê các mặt hàng thuộc loại đó.

<!-- chonLH.Asp -->

<%@ Language="Jscript" %>

<%

DBPath = Server.MapPath("mydb.mdb");

Conn = Server.CreateObject("ADODB.Connection");

ConString="DBQ="+DBPath +";Driver={Microsoft Access Driver (*.mdb)}; ";

Conn.ConnectionString=ConString;

Conn.Open();

Rs=Server.CreateObject("ADODB.Recordset");

SQL="Select * from LOAI_HANG";

Rs=Conn.Execute(SQL);

%>


V d 4 tt
Ví dụ 4 (tt) Recordset

<HTML>

<HEAD><TITLE>Mặt hàng</TITLE></HEAD>

<BODY>

<FORM Name="EDIT" Action="chonLH.asp" METHOD=POST>

Chọn loại hàng:

<SELECT NAME="MaLoai">

<% while ( ! Rs.EOF ) { %>

<OPTION Value="<%=Rs("MaLoai") %>" ><%=Rs("TenLoai") %>

<%

Rs.MoveNext();

}

Rs.Close();

%>

</SELECT><BR>

<INPUT Name="button1" Type=submit Value="Liet Ke">

</FORM>


V d 4 tt1
Ví dụ 4 (tt) Recordset

<%Maloai=""+Request("MaLoai");

if (Maloai != "undefined") {

SQL="SELECT * FROM MAT_HANG WHERE Maloai="+Maloai;

Rs=Conn.Execute(SQL);

if (Rs.BOF) { %>

<FONT SIZE=4 COLOR="#0000FF">Không có mặt hàng nào </FONT>

<% } else { %>

<TABLE ALIGN=center BORDER=1>

<TR><TD> Ten Mat hang </TD> <TD> Gia mat hang </TD>

<% while (! Rs.EOF) { %>

<TR><TD><%=Rs("TenMH")%></TD>

<TD><%=Rs("GiaMH")%></TD>

<% Rs.MoveNext();

}

Rs.Close();

}

%>

</TABLE>

<%

}

Conn.Close();

%></BODY></HTML>


4 ki u con tr lu n l trong recordset
4. Kiểu con trỏ luận lý trong Recordset Recordset

  • Trong các ví dụ ở trên, chúng ta đã sử dụng biến Recordset để lưu trữ kết quả của câu truy vấn SQL, tuy nhiên với hình thức sử dụng như vậy, đối tượng Recordset chỉ cho phép duyệt các Record một cách đơn giản nhất: Duyệt tuần tự từ Record đầu tiên đến record cuối cùng.

  • Ở trường hợp số lượng record lớn, chẳng hạn như có 100 mặt hàng thuộc một loại, nếu làm như trong trang chonMH.asp thì sẽ không có hiệu quả cao trong việc trình bày, thay vào đó chúng ta sẽ trình bày từng phần một và cung cấp khả năng lật trang cho người sử dụng. Để làm như vậy, đối tượng Recordset cung cấp các khả năng phân trang và bookmark, các khả năng này được xác định bởi các thuộc tính:

  • AbsolutePage: Nhận giá trị nguyên N sẽ đặt con trỏ luận lý tới trang luận lý thứ N.

  • PageSize: Xác định số record trang một trang luận lý.

  • PageCount: Trả về số trang luận lý có trong Recordset.

  • Để có thể thay đổi được các thuộc tính AbsolutePage và PageSize, biến Recordset phải lấy dữ liệu bằng phương thức Open thay vì nhận dữ liệu từ phương thức Execute của đối tượng Connection.

  • Phương thức Open trong đối tượng Recordset có cú pháp thực hiện như sau:

  • RecordsetObj.Open(SQL, Conn [,CursorType] [, LockType]);

  • Trong phần này, chúng ta sẽ xem xét tới tham số thứ ba đó là kiểu con trỏ luận lý mà Recordset hỗ trợ, tham số này được xác định bằng một giá trị nguyên.


Recordset h tr c c ki u con tr lu n l sau
Recordset hỗ trợ các kiểu con trỏ luận lý sau: Recordset

  • adOpenForwardOnly: Kiểu này có giá trị bằng 0. Là kiểu duyệt mặc nhiên của Recordset. Khi mở Recordset với kiểu này, chúng ta chỉ có thể di chuyển con trỏ luận lý đi tới bằng phương thức MoveNext().

  • adOpenKeyset: Kiểu này có giá trị bằng 1. Khi mở một Recordset với kiểu con trỏ là adOpenkeyset, chúng ta có thể di chuyển trong Recordset bằng các phương thức MoveNext(), MoveLast(), MoveFirst(), MovePrevious(), hoặc Move(NRecord, FromPositionM). Kiểu này còn gọi là con trỏ động, khi mở recordset sẽ không nhận các Record do client khác đang thêm vào hoặc xoá trong vùng dữ liệu tranh chấp, các record đang thực hiện sửa đổi vẫn được lấy.

  • adOpenDynamic: Có giá trị là 2. Giống hoàn toàn như kiểu adOpenKeyset, ngoại trừ khả năng có thể lấy hết các record trong vùng tranh chấp trong khi các client khác đang thêm, xóa hay sửa đổi. Kiểu này cũng không hỗ trợ khả năng bookmark (thuộc tính AbsolutePage không được hỗ trợ)

  • adOpenStatic: Có giá trị bằng 3. Recordset mở với kiểu này được coi như một phiên bản dữ liệu tĩnh. Nó hoàn toàn không lấy các record có trong vùng tranh chấp dữ liệu mà các client khác đang tiến hành cập nhật hoặc thay đổi. Kiểu này cũng hỗ trợ việc di chuyển con trỏ như hai kiểu trên.


Ví dụ 4: Recordset Trang bangLH.Asp thực hiện việc liệt kê danh sách các tên loại hàng có trong bảng LOAI_HANG. Danh sách này được thể hiện trong một table theo từng trang luận lý.

<!-- listLH.Asp -->

<%@ Language="Jscript" %>

<%

DBPath = Server.MapPath("mydb.mdb");

Conn = Server.CreateObject("ADODB.Connection");

ConString="DBQ="+DBPath+";Driver={Microsoft Access Driver (*.mdb)}; "

Conn.ConnectionString=ConString;

Conn.Open();

// Xác định kiểu con trỏ

adOpenStatic=3;

// Hoặc là adOpenKeyset=1;

// Xác định trang luận lý sẽ hiển thị.

PageNo=1;

Page = Request("Page");

if (Page=="undefined") PageNo=1;

else {

PageNo=parseInt(Page);

if ( isNaN(PageNo)) PageNo = 1;

}


V d 4 tt2
Ví dụ 4 (tt) Recordset

// Tạo câu query

SQL="Select * from LOAI_HANG";

// Tạo recordset

Rs=Server.CreateObject("ADODB.Recordset");

Rs.Open (SQL,Conn, adOpenStatic);

// Hoặc Rs.Open (SQL,Conn, adOpenKeyset);

// Xác định 4 records cho một trang luận lý

Rs.PageSize = 2;

// Đặt con trỏ vào trang hiện tại

Rs.AbsolutePage = PageNo;

%>

<HTML>

<HEAD><TITLE>Các chủng loại hàng</TITLE></HEAD>

<BODY>

<TABLE BORDER=1>

<TR><TD Align="center"> Ma loai </TD><TD Align="center"> Ten loai </TD>


V d 4 tt3
Ví dụ 4 (tt) Recordset

<% for (j = 0; j < Rs.PageSize; j++) { %>

<TR>

<% if (Rs.EOF) break; %>

<TD ALIGN=Center><%= Rs("MaLoai") %></TD>

<TD ALIGN=Center><%= Rs("TenLoai") %></TD>

</TR>

<%

Rs.MoveNext()

}

%>

</TABLE>

<HR>

Bạn có thể xem các trang sau:

<% for (i=1;i<=Rs.PageCount;i++) { %>

<A HREF="listLH.asp?Page=<%=i%>"><%=i%></A>&nbsp;&nbsp;

<%}%>

<%

Rs.Close();

Conn.Close();

%>

</BODY>

</HTML>


Nh n x t
Nhận xét: Recordset

Mở Recordset với bất cứ kiểu con trỏ nào chúng ta đều có thể thực hiện các thao tác thêm một record vào CSDL thông qua recordset, các thay đổi này sẽ được cập nhật vào CSDL khi thực hiện phương thức Update().

Ví dụ sau sẽ minh họa các thao tác thêm sử dụng phương thức AddNew(), xóa record với phương thức Delete(), và phương thức cập nhập Update() của đối tượng Recordset.

Vi dụ 5:insertMH.aspthực hiện thêm một record vào bảng MAT_HANG trong CSDL thông qua recordset.


V d 51
Ví dụ 5. Recordset

<!-- insertMH.Asp -->

<%@ Language="Jscript" %>

<% DBPath = Server.MapPath("mydb.mdb");

Conn = Server.CreateObject("ADODB.Connection");

ConString="DBQ="+DBPath+";Driver={Microsoft Access Driver (*.mdb)}; "

Conn.ConnectionString=ConString;

Conn.Open();

// thực hiện cập nhật.

TenMH=""+Request("TenMH");

if (TenMH !="undefined" && TenMH !="") {

chkName="SELECT * FROM MAT_HANG WHERE TenMH='"+TenMH+"'";


V d 5 tt
Ví dụ 5 (tt) Recordset

chkRs=Server.CreateObject("ADODB.Recordset");

chkRs=Conn.Execute(chkName);

if (chkRs.BOF) { // Chưa có tên mặt hàng đó

LoaiMH=""+Request("LoaiMH");

MaTien=""+Request("MaTien");

DonVi=""+Request("DonVi");

SoLGH=""+Request("SoLGH");

TinhNang=""+Request("TinhNang");

GiaMH=""+Request("GiaMH");

iRs=Server.CreateObject("ADODB.Recordset");

iSql="SELECT * FROM MAT_HANG";

adOpenDynamic=2;

// Hoặc adOpenForwardOnly, hoặc adOpenKeyset,

// hay adOpenStatic đều được.

iRs.Open(iSql, Conn, adOpenDynamic);

iRs.AddNew(); // Tạo một Record mới trong Recordset

// Xác định dữ liệu cho Record mới

iRs("TenMH")=TenMH;

iRs("GiaMH")=parseFloat(GiaMH);

iRs("SoLHG")=parseInt(SoLHG);

iRs("TinhNang")=TinhNang;

iRs("MaTien")=parseInt(MaTien);

iRs("MaLoai")=parseInt(LoaiMH);

iRs("DonVi")=parseInt(DonVi);

iRs.UpDate(); // Cập nhật vào CSDL

iRs.Close();

}

}


V d 5 tt1
Ví dụ 5(tt) Recordset

// Thực hiện lấy dữ liệu để hiển thị trong form.

Rs=Server.CreateObject("ADODB.Recordset");

Rs1=Server.CreateObject("ADODB.Recordset");

Rs2=Server.CreateObject("ADODB.Recordset");

LH="SELECT * FROM LOAI_HANG";

Rs=Conn.Execute(LH);

DV="SELECT * FROM DON_VI";

Rs1=Conn.Execute(DV);

TIEN="SELECT * FROM LOAI_TIEN";

Rs2=Conn.Execute(TIEN);

%>

<HTML><HEAD>

<TITLE>FORM nhập mặt hàng</TITLE></HEAD>

<BODY>

<FORM Name="NhapMH" Action="nhapMH.Asp" Method=POST>

Tên hàng: <INPUT NAME="TenMH" TYPE="text"><BR>

Loai hàng:<SELECT NAME="LoaiMH">


V d 5 tt2
Ví dụ 5 (tt) Recordset

<% while ( ! Rs.EOF ) { %>

<OPTION Value="<%=Rs("MaLoai") %>" ><%=Rs("TenLoai") %>

<%

Rs.MoveNext();

}

Rs.Close();

%>

</SELECT>

Giá: <INPUT NAME="GiaMH" TYPE="text"><BR>

Loai tien:<SELECT NAME="MaTien">

<% while ( ! Rs2.EOF ) { %>

<OPTION Value="<%=Rs2("MaTien") %>" ><%=Rs2("TenLoai") %>

<%

Rs2.MoveNext();

}

Rs2.Close();

%>

</SELECT><BR>


V d 5 tt3
Ví dụ 5 (tt) Recordset

Mô tả tính năng: <INPUT NAME="TinhNang" TYPE="text"><BR>

Số lượng: <INPUT NAME="SoLGH" TYPE="text"><BR>

Don vi tinh:<SELECT NAME="DonVi">

<% while ( ! Rs1.EOF ) { %>

<OPTION Value="<%=Rs1("DonVi") %>" ><%=Rs1("TenDV") %>

<%

Rs1.MoveNext();

}

Rs1.Close();

%>

</SELECT>

<INPUT NAME="Them" TYPE="submit" VALUE="Them MH">

<INPUT NAME="Nhap lai" TYPE="reset" VALUE="Them MH">

</FORM>

<%

Conn.Close();

%>

</BODY>

</HTML>


5 c c ki u kh a d li u khi m recordset
5. Các kiểu khóa dữ liệu khi mở Recordset Recordset

Ở phần này chúng ta sẽ xem xét đến tham số thứ tư của phương thức Open trong Recordset.

RecordsetObj.Open(SQL, Conn [,CursorType] [, LockType]);

Tham số LockType là một giá trị nguyên xác định kiểu khóa dữ liệu (loại trừ tương hỗ bằng phương pháp khóa) mà Recordset sử dụng khi truy xuất vào CSDL. Khi không có mặt tham số này, Recordset sẽ được mở với kiểu khóa mặc nhiên: adLockReadOnly. Ý nghĩa của các kiểu khóa này như sau:

1. adLockReadOnly: Có giá trị bằng 1. Kiểu khóa mặc nhiên này không cho phép thay đổi dữ liệu của các record trong Recordset.

2. adLockPessimistic: Có giá trị bằng 2. Kiểu khóa này thực hiện khóa trên từng record để chắc chắn rằng chỉ có một client thực hiện sự thay đổi dữ liệu trên các record này mà thôi.

3. adLockOptimistic: Có giá trị bằng 3. Kiểu khóa này cũng áp đặt khóa lên từng Record, tuy nhiên chỉ khóa khi gọi thực hiện phương thức Update() mà thôi.

4. adLockBatchOptimistic: Có giá trị bằng 4. Giống như adLockOptimistic, nhưng dùng cho trường hợp sử dụng hàm UpdateBatch().


Ví dụ 6: Recordset Trang addSLH.asp cho phép chọn một mặt hàng để thêm số lượng. Thao tác được thực hiện thông qua đối tượng Recordset.

<!-- adSLH.Asp -->

<%@ Language="Jscript" %>

<%

DBPath = Server.MapPath("mydb.mdb");

Conn = Server.CreateObject("ADODB.Connection");

ConString="DBQ="+DBPath +";Driver={Microsoft Access Driver (*.mdb)}; ";

Conn.ConnectionString=ConString;

Conn.Open();

Rs=Server.CreateObject("ADODB.Recordset");

Sql="SELECT * FROM MAT_HANG";

Rs=Conn.Execute(Sql);

MaMH=""+Request("MaMH");

SLThem=""+Request("SLThem");

if (MaMH != "undefined" && SLThem != "undefined" && SLThem!="") {

uSql="SELECT * FROM MAT_HANG WHERE MaMH="+MaMH;

Response.write(uSql);

uRs=Server.CreateObject("ADODB.Recordset");

adOpenForwardOnly=0;

adLockOptimistic=3;

uRs.Open(uSql,Conn,adOpenForwardOnly, adLockOptimistic);

// Chắc chắn uRs chỉ có nhiều nhất là 1 record

if ( !uRs.EOF) { // Điều kiện này có thể không cần thiết trong ví dụ cụ thể này.

uRs.Fields("SoLHG")=uRs("SoLHG")+parseInt(SLThem);

uRs.Update(); // Cập nhật vào CSDL

uRs.Close();

}

}

%>


V d 6 tt1
Ví dụ 6 (tt) Recordset

<HTML>

<HEAD><TITLE>Các chủng loại hàng</TITLE></HEAD>

<BODY>

<FORM Name="EDIT" Action="addSLH.asp" METHOD=POST>

Chọn mặt hàng :

<SELECT NAME="MaMH">

<% while ( ! Rs.EOF ) { %>

<OPTION Value="<%=Rs("MaMH") %>" >

<%=Rs("TenMH") + "&nbsp;&nbsp;(SoLuong="+Rs("SoLHG")+")" %>

<%

Rs.MoveNext();

}

%>

</SELECT><BR>

Thêm số lượng:<INPUT Name="SLThem" Type="Text" ><BR>

<INPUT Name="Button1" Type=Submit Value="Them" >

<INPUT Name="Button2" Type=Reset Value="Nhap Lai">

</FORM>

<%

Rs.Close();

Conn.Close();

%>

</BODY>

</HTML>


ad