Dim lenhsql3 As String = "insert sanpham values " & _ "(6,'LCD Sony 32 inch', 'SONY',10900000)"
Dim cmd3 As New SqlClient.SqlCommand(lenhsql3, Ket_noi) Cmd3.ExecuteNonQuery()
Ket_noi.Close()
5.3.4 Parameter
a. Khai báo và sử dụng tham số
Trong CommandText có thể sử dụng các tham số để thay thế cho các giá trị chưa xác định và khi thực hiện sẽ dùng đối tượng Parameter để truyền giá trị vào chỗ các dấu hỏi. Tùy theo Command, Parameter sẽ khai báo từ lớp OledbParameter hay SqlParameter. Tại vị trí cần thay bằng tham số sẽ để dấu ? nếu là lớp OledbParameter và để @tên_biến_thamsố nếu là SqlParameter
Các cú pháp khai báo tham số:
Dim <tên parameter> As New loại_tham_số()
Trong đó loại_tham_số là OledbParameter hoặc SqlParameter
Hoặc
Dim <tên parameter> As New loại_tham_số(tên_ts)
Hoặc
Dim <tên parameter> As New loại_tham_số (tên_ts, giá trị)
Hoặc
Dim <tên parameter> As New loại_tham_số = biến_command.CreateParameter
Các thuộc tính của tham số
Mô tả | |
Direction | Giá trị cho biết loại tham số với các giá trị sau: (đọc ghi) Input (mặc định): loại tham số đầu vào InputOutput: loại tham số vào và ra Output: loại tham số đầu ra ReturnValue: loại tham số nhận giá trị trả về của một thủ tục nội, một hàm, hay một hàm do người dùng định nghĩa. |
OleDbType SqlDbType | Kiểu dữ liệu OleDb hoặc SqlDb của tham số (đọc ghi) |
ParameterName | Tên tham số (đọc ghi) |
Value | Giá trị của tham số (đọc ghi) |
Có thể bạn quan tâm!
- Lập trình cơ sở dữ liệu - CĐ Nghề Công Nghiệp Hà Nội - 14
- Lập trình cơ sở dữ liệu - CĐ Nghề Công Nghiệp Hà Nội - 15
- Lập trình cơ sở dữ liệu - CĐ Nghề Công Nghiệp Hà Nội - 16
- Sử Dụng Dataadapter Lấy Cấu Trúc Từ Nguồn Dữ Liệu
- Lấy Ra Dòng Dữ Liệu Đã Thay Đổi Trong Dataset
- Lập trình cơ sở dữ liệu - CĐ Nghề Công Nghiệp Hà Nội - 20
Xem toàn bộ 201 trang tài liệu này.
Ví dụ 5.4: Sử dụng tham số trong command
Thiết kế form như hình dưới đây. Nút Thống kê kết nối đến cơ sở dữ liệu SQL De1 trên server HTC-VAIOHuyen và hiển thị số lần bán hàng trong textbox txtcount và tổng số tiền bán hàng của nhân viên trong textbox txtsum. Tên nhân viên (textbox1) được định nghĩa là tham số.
Tạo tham số với Command để hiển thị số lần bán hàng:
' tạo và mở connection Tao_ket_noi() Ket_noi.Open()
' hiển thị số lần bán hàng
Dim lenhsql as string = "select count(sohd) from banhang " & _ "where nguoiban=@nb"
Dim cmdcount As New SqlClient.SqlCommand(lenhsql,Ket_noi)
Dim thamsonb As SqlClient.SqlParameter = cmdcount.CreateParameter thamsonb.ParameterName = "@nb"
thamsonb.Value = TextBox1.Text cmdcount.Parameters.Add(thamsonb) txtcount.Text = cmdcount.ExecuteScalar()
' đóng kết nối Ket_noi.Close()
Ta có thể viết đoạn mã tương tự để hiển thị tổng số tiền bán hàng với tên nhân viên là tham số. Hoặc sử dụng cách viết như sau: (dùng chung tham số @nb cho đối tượng command có command text thay đổi theo câu lệnh SQL tương ứng).
' tạo và mở connection Tao_ket_noi() Ket_noi.Open()
' hiển thị số lần bán hàng
Dim cmd As New SqlClient.SqlCommand
cmd.CommandText = "select count(sohd) from banhang where " & _ "nguoiban=@nb"
cmd.Connection = Ket_noi
Dim thamsonb As SqlClient.SqlParameter = cmd.CreateParameter thamsonb.ParameterName = "@nb"
thamsonb.Value = TextBox1.Text
cmd.Parameters.Add(thamsonb) txtcount.Text = cmd.ExecuteScalar()
' hiển thị tổng số tiền bán hàng
cmd.CommandText = "select sum(thanhtien) from banhang where " & _ "nguoiban=@nb"
txtsum.Text = cmd.ExecuteScalar() ' đóng kết nối
Ket_noi.Close()
Khi sử dụng OLEDBCommand thì câu lệnh SQL thay đổi như sau:
lenh.CommandText = "Select sum(thanhtien) from banhang " & _ where nguoiban = ?"
Dim thamso As OleDbParameter = lenh.CreateParameter() thamso.Value = "An"
lenh.Parameters.Add(thamso)
b. Đưa tham số trực tiếp vào tập hợp Parameters
Có thể đưa nhiều tham số trực tiếp vào tập hợp Parameter. Mỗi tham số được đưa vào theo cú pháp như sau:
Dim tên_thamsố as Loại_thamsố = _ tên_command.CreateParameter(tên_thamsố, kiểu_dữ_liệu, kích_cỡ) Tên_thamsố.Value = giá_trị
Nếu là OLEDBParameter thì danh sách tham số đưa vào phải đúng theo thứ tự của danh sách tham số trong câu lệnh. Nếu là SQL thì không cần theo đúng thứ tự.
Ví dụ 5.5: Hiển thị số tiền bán hàng của một nhân viên trong một ngày nào đó:
Form được thiết kế như mẫu sau. Tên nhân viên được nhập vào hộp txtten; ngày bán nhập vào hộp txtngay, tổng tiền bán hàng được hiển thị trong txtsum.
Biến cố Click của nút Thống kê
Tao_ket_noi() Ket_noi.Open()
Dim cmd As New SqlClient.SqlCommand
cmd.CommandText = "select sum(thanhtien) from banhang " & _ "where nguoiban=@nb and ngayban=@ngay"
cmd.Connection = Ket_noi
Dim thamsonb As SqlClient.SqlParameter = _ cmd.Parameters.Add("@nb", SqlDbType.NVarChar, 50) thamsonb.Value = txtten.Text
Dim thamsongay As SqlClient.SqlParameter = _ cmd.Parameters.Add("@ngay", SqlDbType.DateTime) thamsongay.Value = CDate(txtngay.Text)
txtsum.Text = cmd.ExecuteScalar()
Ket_noi.Close()
c. Truyền tham số
Ví dụ 5.6: Giả sử trong cơ sở dữ liệu De1, ta đã tạo một thủ tục nội tại trả về tổng số tiền bán được của một nhân viên. Thủ tục được tạo như sau:
create function ThongKeNV (@tnb nvarchar(50)) returns decimal
as begin
declare @tt decimal
select @tt= sum(thanhtien) from banhang where nguoiban=@tnb return (@tt)
end
Thủ tục có một tham số đầu vào là @tnb thuộc kiểu nvarchar(50) tương ứng với tên một nhân viên bán hàng và trả về giá trị thuộc kiểu decimal tương ứng với tổng số tiền bán được của nhân viên đó. Ta sẽ xây dựng chương trình sử dụng đối tượng command với 2 tham số được truyền vào (1 tham số trả về và một tham số đầu vào). Tham số trả về phải được truyền cho command trước tiên.
Form được thiết kế như hình dưới đây. Tên nhân viên được chọn trong combo box (cboten). Nút Thống kê dùng để gọi hàm thongkenv đã tạo trong SQL và hiển thị kết quả trong textbox txtsum.
Biến cố Click của nút Thống kê:
' hiển thị số lần bán hàng Tao_ket_noi() Ket_noi.Open()
' tạo command có tên cmd tương ứng với thủ tục thongkenv Dim cmd As New SqlClient.SqlCommand cmd.Connection = Ket_noi
cmd.CommandType = CommandType.StoredProcedure cmd.CommandText = "thongkenv"
' tạo tham số sotien là tham số trả về
Dim sotien As New SqlClient.SqlParameter sotien.Direction = ParameterDirection.ReturnValue
sotien.SqlDbType = SqlDbType.Decimal cmd.Parameters.Add(sotien)
' tạo tham số thamsonb là tham số đầu vào ứng với người bán Dim thamsonb As SqlClient.SqlParameter = _ cmd.Parameters.Add("@tnb", SqlDbType.NVarChar, 50)
' thiết lập giá trị cho thamsonb thamsonb.Value = cboten.Text
' thực thi command cmd.ExecuteScalar()
' hiển thị giá trị tham số txtsum.Text = sotien.Value
' đóng kết nối Ket_noi.Close()
5.4 DataReader
Là đối tượng truy cập dữ liệu trực tiếp, sử dụng con trỏ phía Server và duy trì kết nối với Server trong suốt quá trình đọc dữ liệu, DataReader thuộc không gian tên System.Data.OledbDataReader hoặc System.Data.SqlDataReader
5.4.1 Các thuộc tính của DataReader
Mô tả | |
FieldCount | Trả về số cột trên dòng hiện hành của DataReader. |
IsClosed | Cho biết DataReader đã đóng chưa. |
Item | Trị của cột truyền vào. Tham số truyền có thể là tên cột hoặc số thứ tự (từ 0) |
5.4.2 Các phương thức của DataReader
Mô tả | |
Close | Đóng DataReader. |
GetFieldType | Trả về kiểu dữ liệu của cột truyền vào. |
GetName | Trả về tên của cột truyền vào. |
GetOrdinal | Trả về số thứ tự của cột truyền vào (bắt đầu từ 0). |
GetSchemaTable | Trả về bảng chứa thông tin mô tả cột của DataReader. |
GetValue | Trả về giá trị trên cột truyền vào. |
Read | Di chuyển đến dòng kế tiếp và trả về True nếu còn dòng để di chuyển, ngược lại trả về False |
Trong khi DataReader đang mở, các thao tác dữ liệu khác trên nguồn dữ liệu đều không thể thực hiện cho đến khi DataReader đóng lại bằng lệnh Close.
5.4.3 Tạo và sử dụng DataReader
DataReader được tạo với cách duy nhất là gọi phương thức ExcuteReader của đối tượng Command.
Cú pháp: Tên_command.ExecuteReader() Hoặc
Tên_command.ExecuteReader(<behavior>)
Các giá trị của behavior:
Mô tả | |
CloseConnection | Khi đối tượng DataReader đóng lại, Connection tự động đóng theo. |
Default | Tương tự như khi gọi ExecuteReader() |
SchemaOnly | Truy vấn chỉ trả về cấu trúc các cột và không làm ảnh hưởng đến các thao tác khác. |
Ví dụ 5.7 Thiết kế form như hình sau:
Form sử dụng DataReader để lưu trữ kết quả truy vấn được chọn trong Listbox1. Nút OK để thực hiện truy vấn. Nếu còn dữ liệu chưa được đọc trong datareader thì nút OK chuyển thành nút Tiếp để xem các bản ghi còn lại. Nếu dữ liệu đã được đọc hết thì các hộp textbox sẽ được xóa trắng và nút Tiếp lại trở thành nút OK.
- Khai báo các biến chung của class: (đặt ngay sau dòng Public Class, bên ngoài tất cả các Sub).
Dim cmd As New SqlClient.SqlCommand Dim reader1 As SqlClient.SqlDataReader
- Gọi thủ tục Tao_Ket_Noi() trong sự kiện Load của Form
Tao_ket_noi()
- Đóng kết nối và đóng datareader trong sự kiện FormClosed
If Ket_noi.State = ConnectionState.Open Then reader1.Close()
End If
- Sự kiện Click của cmdOK
If ListBox1.SelectedItem Is Nothing Then MsgBox("Hãy chọn một câu lệnh")
Else
' tạo command cmd
cmd.CommandText = ListBox1.SelectedItem cmd.Connection = Ket_noi
' mở kết nối và tạo reader nếu kết nối đang đóng If Ket_noi.State = ConnectionState.Closed Then
Ket_noi.Open() reader1 = _
cmd.ExecuteReader(CommandBehavior.CloseConnection)
End If
' đọc dữ liệu trong reader1 vào textbox If reader1.Read() Then
cmdOK.Text = "Tiếp"
txtngay.Text = reader1.Item("ngayban") txtten.Text = reader1.Item("nguoiban") txtst.Text = reader1.Item("thanhtien")
Else
' đọc hết reader1 cmdOK.Text = "OK" txtten.Clear() txtst.Clear() reader1.Close()
End If
My.Application.DoEvents() End If
5.5 DataAdapter
Để lấy dữ liệu từ nguồn dữ liệu về cho ứng dụng, chúng ta sử dụng một đối tượng gọi là DataAdapter. Đối tượng này cho phép lấy cấu trúc và dữ liệu của các bảng trong nguồn dữ liệu.