1 / 53

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.

garnet
Download Presentation

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

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. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 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.

  2. 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.

  3. 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ý.

  4. 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.

  5. 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.

  6. 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)};

  7. 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:

  8. Đố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”);

  9. 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

  10. 1. Cơ sở dữ liệu ví dụ 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)

  11. 2. LOAI_HANG(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

  12. Quá trình làm việc với CSDL trong một trang ASP. • 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.

  13. 2. Đối tượng Connection Đố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.

  14. Ví dụ 1: 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(); %>

  15. Ví dụ 2: 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:

  16. Bước 1. 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=

  17. Bước 2. Thực hiện kết nối. <% Conn=Server.CreateObject("ADODB.Connection"); DBPath=Server.MapPath("mydb.mdb"); DSNPath=Server.MapPath("mydata.dsn"); Conn.ConnectionString="fileDSN="+DSNPath+";DBQ="+DBPath; Conn.Open(); %>

  18. Ví dụ 3: 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();%>

  19. <% 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(); %>

  20. Đóng kết nối. 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.

  21. Thực hiện câu truy vấn SQL. Đố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.

  22. Ví dụ 5: Đ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.

  23. Ví dụ 6: 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>

  24. <!—insertLH.asp -- > <%@ 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)

  25. 3. Đối tượng 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).

  26. Con trỏ 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.

  27. Một số thuộc tính và phương thức • Để 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().

  28. Giải thuật duyệt truy vấn và 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();

  29. Ví dụ 1: 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); %>

  30. Ví dụ 1 (tt) <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>

  31. 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. <!-- 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); %>

  32. Ví dụ 2(tt) <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>

  33. Vi dụ 3: 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");

  34. Ví dụ 3 (tt) 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); %>

  35. Ví dụ 3(tt) <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(); %>

  36. Ví dụ 3(tt) </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>

  37. Ví dụ 4.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); %>

  38. Ví dụ 4 (tt) <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>

  39. Ví dụ 4 (tt) <%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>

  40. 4. Kiểu con trỏ luận lý trong 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.

  41. Recordset hỗ trợ các kiểu con trỏ luận lý sau: • 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.

  42. Ví dụ 4: 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; }

  43. Ví dụ 4 (tt) // 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>

  44. Ví dụ 4 (tt) <% 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>

  45. Nhận xét: 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.

  46. Ví dụ 5. <!-- 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+"'";

  47. Ví dụ 5 (tt) 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(); } }

  48. Ví dụ 5(tt) // 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">

  49. Ví dụ 5 (tt) <% 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>

  50. Ví dụ 5 (tt) 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>

More Related