Sử dụng thamsố cho các lệnh SQL.

Một phần của tài liệu Giáo trình ASP (Trang 38 - 47)

VI. 4 Thành phần Browser Capabilities

2.2 Sử dụng thamsố cho các lệnh SQL.

Nếu như query cần thực hiện có yêu cầu các tham số, thì ta phải thêm các tham số này vào Parameter collection trước khi thực hiện câu lệnh. Đối với phương thức Execute của đối tượng Connection không có khả năng này.

Sử dụng phương thức Execute của đối tượng Command thực thi câu query chỉ định trong CommandText property.

Cú pháp

Set recordset = command. Execute(RecordsAffected, Parameters, Options) command.Execute RecordsAffected, Parameters, Options

Trong đó

recordset: Một biến đối tượng Recordset chứa kết quả truy vấn. command: Một biến đối tượng đại diện cho đối tượng Command.

RecordAffected và Options có chức năng và giá trị giống như trong đối tượng Connection.

Để tìm hiểu cách tạo ra danh sách các tham số của câu lệnh, ta hãy xem xét các phương thức và property của Parameter collection.

Phương thức Mô tả

Append Thêm một tham số vào collection. Delete Xoá một tham số trong collection.

Refresh Cập nhật collection để phản ánh sự thay đổ i các tham số.

Property Mô tả

Count Trả về số tham số trong collection.

Item Lấy lại giá trị của một tham số trong collection. Tạo và thêm tham số vào Collection

Mỗi một phần tử của Parameter collection có thể coi như một đối tượng Parameter và chúng cũng có các đặc tính (property) riêng của mình.

Property Mô tả

Attributes Kiểu dữ liệu mà tham số chấp nhận.

Direction Thể hiện kiểu dữ liệu mà tham số là Input hay Output, hay là cả hai, hay nó là giá trị trả về từ một thủ tục lưu trữ sẵn (stored procedure).

Name Tên của tham số.

NumericScale Số chữ số thập phân trong tham số kiểu số. Precision Số chữ số của tham số kiểu số.

Size Kích thước lớn nhất, tính theo byte, của giá trị tham số. Type Kiểu dữ liệu của tham số.

Value Giá trị gán cho tham số.

Để tạo một đối tượng Parameter mới, sử dụng phương thức CreateParameter của đối tượng Command

Cú pháp

Set pamareter = command.CreateParameter(Name, Type, Direction, Size, Value)

Để thêm một tham số mới vào Parameter collection. Trước tiên ta phải tạo một thực thể (instance) cho đối tượng Parameter, sau đó thiết lập các giá trị property cho nó và cuối cùng sử dụng phương thức Append.

Ví dụ: tạo một tham số mới và thêm tham số này vào Parameter collection. Set objParam = objCmd.CreateParameter ( “State”, 128, 1, 2, ”Ny” )

objCmd.Parameters.append objParam Ví dụ:

<%

‘tạo một thực thểcủa đối tượng Command

objCmd = Server.CreateObject(“ADODB. Command”) ‘tạo kết nối

objConn.Open "DSN=student;uid=student;pwd=magic" objCmd.activeConnection = objConn.Open

objCmd.CommandText="DeleteStateQuery" ‘cho biết CommandText là một thủ tục lưu trữ sẵn objCmd.CommandType = 4

strValue=Request. Form(“txtState”) ‘khi submit từ một form

Set objParam = objCmd.CreateParameter ( “State” ) ‘chỉ có tên tham số

ObjParam.Type=adChar ‘ kiểu tham số là chuỗi

ObjParam.Direction=adParamInput ‘một query đưa vào tham số

ObjParam.Size=Len(strValue) ‘kích thước của chuỗi

ObjParam.Value=strValue ‘giá trị chuỗi

objCmd.Parameters.append objParam ‘thêm tham số vào collection

objCmd.Execute ‘thực thi câu lệnh

Set objCmd.activeConnection = Nothing ‘giải phóng tài nguyên đã sử dụng

%>

Tham khảo các đối tượng collection

Mỗi khi chúng ta có các tham số trong collection. Để lấy giá trị của tham số trong collection ta có thể sử dụng Item property hoặc sử dụng chỉ mục (index) hoặc là tên tham số.

Cú pháp

objCmd.Parameters.Item(index) hoặc objCmd.Parameters(index)

hoặc objCmd.Parameters. Item(tên_tham_số) hoặc là objCmd.Parameters(tên_tham_số)

Ví dụ: để lấy giá trị của tham số State và 128 ở ví dụ trên, ta có thể sử dụng các Cú pháp objCmd.Parameters.Item(0) hoặc objCmd.Parameters(0) hoặc objCmd.Parameters.Item(“State”) hoặc là objCmd.Parameters(“State”) tương tự objCmd.Parameters.Item(1) hoặc objCmd.Parameters(1) hoặc objCmd.Parameters.Item(128)

hoặc là objCmd.Parameters(128) Đọc và hủy bỏ các tham số

Chúng ta có thể sử dụng vòng lặp For…Each để xuất ra tên và giá trị của tất cả các tham sốtrong Parameter collection và đặt chúng trong trang hiện hành sử dụng phương thức Response.Write

Ví dụ: <%

For Each objParam In objCmd.Parameters

Response.Write “Parameter name = ” & objParam.Name & “<br>” Response.Write “Parameter value = ” & objParam.Value

Next %>

Để hủy bỏ một tham số trong Parameter collection, sử dụng phương thức Delete. Ví dụ: xoá tham số tên State, chúng ta có thể sử dụng tên hoặc chỉ mục của nó objCmd.Parameters.Delete “State”

objCmd.Parameters.Delete 0

3. Đối tượng Recordset.

Bằng cách sử dụng các đối tượng Connection và Command ta có thể thực thi các query để thêm vào, cập nhật hay xóa một record trong data source. Tuy nhiên trong các ứng dụng thì ta cũng phải thực hiện việc lấy ra một số các record từ ADO, để hiển thị giá trị của chúng ta phải sử dụng đối tượng Recordset. Sử dụng Recordset để hiển thị các record

Một Recordset có thể được sử dụng để tượng trưng cho các record trong một bảng database. Nó có thể chứa một hoặc nhiều record (hàng), mỗi record có thể chứa một hoặc nhiều field (cột). Để tạo một thực thể (instance) của đối tượng Recordset, sử dụng phương thức

Server.CreateObject:

Set objRs = Server.CreateObject("ADODB.Recordset")

Sau khi đã có biến đối tượng Recordset, ta có thể khởi tạo giá trị cho nó bằng cách lưu kết quả trả về mỗi khi thực thi phương thức Execute của đối tượng Connection hay Command. Để hiển thị các record trong Recordset, sử dụng vòng lặp thông qua các record.

Ví dụ: <%

Set objConn = Server.CreateObject(“ADODB.Connection”) ‘tạo một thực thể (instance) của đối tượng Connection

Set objRs = Server. CreateObject(“ADODB.Recordset”) objConn.Open "DSN=student;uid=student;pwd=magic"

Set objRs = objConn.Execute(“SELECT * FROM MyTable” ) Do While objRs.EOF

Response.Write objRs(“Name”) & “<br>” objRs.MoveNext Loop Set objRs.Close Set objConn.Close %>

Làm việc với Fields Collection.

Mỗi đối tượng Recordset có một Fields collection chứa dữ liệu và thông

tin về mỗi trường (field) trong record hiện hành. Sử dụng Fields collection để lấy mỗi record trong Recordset.

Phương thức Mô tả

Refresh Cập nhật collection để phản ánh sự thay đổi tới giá trị các field.

Property Mô tả

Count Trả về số field trong collection.

Item Lấy lại nội dung của các field trong collection.

Để hiển thị giá trị của cột trong bảng, bạn có thể sử dụng tên của trường (cột) hoặc khi bạn không biết tên của trường (cột) thì ta có thể sử dụng chỉ mục của trường đó để hiển thị.

Chú ý: chỉ số của cácfiled trong record được đánh số từ 0 cho tới giá trị objRs.Fields.Count-1.

Ví dụ: hiển thị tất cả các hàng và cột trong một bảng <HTML>

<HEAD>

<TITLE>Dislay Database Example</TITLE> </HEAD>

<BODY bgcolor="#FFFFFF">

<% whichDSN="DSN=student;uid=student;pwd=magic" Mysql="Select * From MyTable "

Set objConn = Server.CreateObject("ADODB.Connection") Conn.Open whichDSN

Set objRs = Server.CreateObject("ADODB. Recordset") Mysql="Select * From MyTable "

objRs = objConn. Execute("Select * From MyTable ") howmanyfields= objRs.Fields.Count –1

‘chứa số field trong Recordset %>

<TABLE border=1> <TR>

‘hiển thị tên của các field

<% for i=0 to howmanyfields %>

<TD><b><%= objRs(i).Name %></b></TD> <% Next %> </TR>

‘hiển thị tất cả các field trong Recordset <% Do While Not objRs.eof %>

<TR> <% for i =0 to howmanyfields %> <TD><% = objRs (i) %></TD> <% Next %> </TR> <% objRs.movenext Loop objRs.close set objRs=nothing objConn.close set objConn=nothing %> </TABLE> </BODY> </HTML>

Các kiểu con trỏ (Cursor) và khóa (Locking) Recordset

Một cursor xác định kiểu thao tác có thể thực hiện và kiểu thay đổi mà các user khác khi mở một Recordset.

Còn kiểu locking xác định database sẽ xử lý trường hợp nhiều user cố gắng thay đổi một record trong cùng một lúc.

Để thực hiện việc này, đầu tiên bạn tạo một thực thể (instance) của đối tượng Recordset, sau đó sử dụng phương thức Open để mở một Recordset.

Cú pháp

objRs.Open Source, ActiveConnection, CursorType, LockType, Options với các tham số:

Source: Một đối tượng Command, câu lệnh SQL, tên bảng hoặc thủ tục lưu trữ sẵn (stored procedure).

ActiveConnection: Tên của dt Connection đã được mở kết nối với cơ sở dữ liệu cần làmviệc.

CursorType: Kiểu của con trỏ được sử dụng khi mở Recordset. CursorType sử dụng các kiểu cursor khi mở Recordset là:

AdOpenForwardOnly: (Mặc định)Với tham số này bạn chỉ có thể duyệt các record trong Recordset theo một chiều từ đầu đến cuối.

AdOpenKeyset: Recordset được mở có khả năng cho phép ta cập nhập

các record (xóa, thay đổi). Tuy nhiên, nếu user khác thêm một record mới, record này sẽ không xuất hiện trong Recordset.

AdOpenDynamic: Có thể duyệt theo tất cả các chiều (lên, xuống) trong Recordset. Phản ánh tất cả những thay đổi (thêm vào, sửa đổi, loại bỏ) record trong Recordset do user thực hiện.

AdOpenStatic: Bạn có thể duyệt theo tất cả các chiều (lên, xuống) trong Recordset. Không phản ánh tất cả những thay đổi record trong Recordset do user thực hiện.

LockType: Kiểu locking sử dụng khi mở Recordset. LockType sử dụng các kiểu locking khi mở Recordset là:

adLockReadOnly: Mặc định. Không thể thay đổi các record trong Recordset.

adLockOptimistic: Một record chỉ bị lock (khóa) ngay sau khi thay đổi dữ liệu trên Recordset trên data source.

adLockPessimistic: Một record chỉ bị lock (khóa) khi bạn gọi phương thức Update của Recordset.

adLockBatchOptimistic: Các record sẽ được cập nhật theo bó (batch update). Options: Kiểu của query hoặc bảng đại diện bởi Source.

Ví dụ: <HTML> <HEAD>

<TITLE>Cursor and Locking Example</TITLE> </HEAD>

<%

Set objConn = Server.CreateObject(“ADODB.Connection”) Set objRs = Server.CreateObject(“ADODB.Recordset”) objConn.Open "DSN=student;uid=student;pwd=magic" MySql=(“Select * From MyTable”)

objRs.Open Mysql, objConn, adOpenForwardOnly, adLockReadOnly, adCmdText objRs.close set objRs=nothing objConn.close set objConn=nothing %> </BODY> </HTML>

Bạn có thể sử dụng một số phương thức của Recordset để sửa đổi các record trong một Recordset.

Phương thức Mô tả

AddNew Thêm một record mới vào Recordset.

Close Đóng lại đối tượng Recordset và các đối tượng con của nó. Delete Xoá record hiện hành trong Recordset.

Requery Thực hiện lại query.

Update Lưu các thay đổi trên record hiện hành.

Ví dụ: sử dụng phương thức AddNew để thêm một record vào Recordset <HTML>

<HEAD>

<TITLE>AddNew Database Example</TITLE> </HEAD>

<%

Set objConn = Server.CreateObject(“ADODB.Connection”) Set objRs = Server.CreateObject(“ADODB.Recordset”) objConn.Open "DSN=student;uid=student;pwd=magic" MySql=(“Select Name From MyTable”)

objRs.Open Mysql, objConn, adOpenForwardOnly, adLockReadOnly, adCmdText objRs.addNew(“Name”)=“David” objRs.Update objRs.close set objRs=nothing objConn.close set objConn=nothing %> </BODY> </HTML>

Duyệt các record trên Recordset.

Đối tượng Recordset bao gồm một số phương thức để dịch chuyển qua

các record trong một Recordset, record mà nó dịch chuyển tới là record hiện hành. Khi mở một Recordset thì kiểu CursorType mặc định là adOpenForwardOnly nghĩa là chúng ta chỉ có thể dịch chuyển về phía trước, còn nếu muốn dịch chuyển quanh một Recordset thì ta cần mở Recordset với kiểu CursorType là adOpenStatic (hoặc adOpenDynamic, adOpenKeyset).

Move: Dịch chuyển vị trí của record hiện hành. MoveFirst: Dịch chuyển về record đầu tiên. MoveLast: Dịch chuyển về record cuối cùng. MoveNext: Dịch chuyển về record kế tiếp. MovePrevious: Dịch chuyển về record trước đó.

Khi ta đã có một Recordset, để hiển thị truy xuất tới mỗi Recordset trong đó ta có thể sử dụng các phương thức duyệt như: MoveFirst, MoveLast, MoveNext, MovePrevious sẽ õ lấy được nội dung của record đầu tiên, cuối cùng, kế tiếp hay record phía trước.

Khi sử dụng các phương thức để dịch chuyển các vị trí không xác định. Nếu record hiện hành là record là record cuối cùng trong Recordset thì khi gọi phương thức MoveNext thì sẽ gây ra lỗi. Để tránh trường hợp này thì ta sử dụng các property của Recordset như BOF, EOF để xác định record hiện hành là đầu tiên hay là cuối cùng. Các property này có ý nghĩa như sau:

BOF property có giá trị TRUE nghĩa là con trỏ đang ở vị trí đầu Recordset, khi Recordset mới được mở thì BOF luôn có giá trị này.

EOF property có giá trị TRUE nghĩa là con trỏ đang ở vị trí cuối cùng của Recordset. Nếu không có record nào trong Recordset thì cả BOF lẫn EOF đều là TRUE.

Ví dụ: sử dụng một vòng lặp và phương thức MoveNext để duyệt các record trong Recordset.

<HTML> <HEAD>

<TITLE>AddNew Database Example</TITLE> </HEAD>

<%

Set objConn = Server.CreateObject(“ADODB.Connection”) Set objRs = Server.CreateObject(“ADODB.Recordset”) objConn.Open "DSN=student;uid=student;pwd=magic" MySql=(“Select Name From MyTable”)

objRs.Open Mysql, objConn, adOpenDynamic, adCmdText objRs.MoveLast

Do While Not objRs.BOF

Response.Write “<br>” & objRs(“Name”) objRs.MovePrevious Loop objRs.Close set objRs=Nothing objConn.Close set objConn=Nothing %> </BODY> </HTML> Lưu ý:

BOF và EOF có các điểm sau:

Nếu Recordset không chứa record nào khi bạn mở nó cả BOF và EOF là TRUE.

Khi BOF và EOF là TRUE, thuộc tính vẫn còn là TRUE cho đến khi bạn di chuyển

Khi BOF hay EOF là FALSE và record duy nhất trong recordset bị xóa, thuộc tính

vẫn giữ FALSE cho tới khi bạn cố di chuyển tới 1 record khác, ở thời điểm này cả BOF và EOF trở thành TRUE.

Vào lúc bạn tạo hay mở một Recordset có chứa ít nhất một record, record đầu tiên là

Một phần của tài liệu Giáo trình ASP (Trang 38 - 47)