Xem mẫu

  1. Chương 6. Giới thiệu ADO.NET 6.1. Kiến trúc ADO.NET Trong những ngày đầu khi Internet mới phát triển ADO được sử dụng nhiều trong các ứng dụng Web viết bằng ASP. Sau này, Mircosoft nhận ra mô hình kết nối ADO không thích hợp cho mô hình ứng dụng Internet và những ứng dụng phân tán trong tương lai. Một cuộc cách mạng lớn đã diễn ra để tạo nên công nghệ hoàn thiện ADO.NET. ADO.NET hỗ trợ rất mạnh các ứng dụng phân tán, ứng dụng Internet, ứng dụng đòi hỏi tốc độ và khối lượng người truy cập đồng thời lớn. Trong kiến trúc ADO.NET có hai thành phần chính đó là: thành phần truy cập dữ liệu và thành phần lưu trữ xử lý dữ liệu. Thành phần thứ nhất gọi là .NET Framework Data Providers, được thiết kế để thực hiện các thao tác kết nối, gửi các lệnh xử lý đến CSDL, thành phần này còn được gọi với tên khác là lớp kết nối (Connectivity Layer). Trong ADO.NET có bốn đối tượng chính để xử lý phần kết nối và tương tác với dữ liệu là: - Connection: Đối tượng cho phép kết nối đến nguồn cơ sở dữ liệu như: SQL Server, Oracle, ODBC, OLEDB - Command: Đối tượng cho phép truy nhập CSDL và thực thi phát biểu SQL hay thủ tục lưu trữ của CSDL, truyền tham số và trả lại dữ liệu - DataReader: Bộ đọc, dùng để đọc nhanh dữ liệu nguồn theo một chiều - DataAdapter: Bộ điều phối hay cầu nối, dùng để chuyển dữ liệu truy vấn được cho các đối tượng lưu trữ và xử lý như DataSet, DataTable, DataAdapter chủ yếu sẽ thực hiện các thao tác truy vấn, thêm mới, chỉnh sửa, xóa dữ liệu Thành phần thứ hai, DataSet được xem như đối tượng chứa dùng để chứa đối tượng liên quan đến dữ liệu như DataTable, DataRelation, DataView, đôi khi DataSet còn được gọi là là lớp không kết nối (Disconnected layer). Có thể hình dung DataSet như một CSDL nhỏ. ADO.NET cung cấp một giao diện hay đặc tả cho các đối tượng như Connection, Command, DataReader, DataAdapter. Các nhà cung cấp sẽ đưa ra các trình điều khiển gọi là Provider. Mỗi Provider sẽ đặt tên cho các đối tượng theo 136
  2. cách của họ, thông thường là thêm tiếp đầu ngữ của Provider vào tên 4 đối tượng nêu trên. Cụ thể: Provider SQL Server, namespace System.Data.SqlClient, sẽ thêm tiếp đầu ngữ là Sql vào tên của 4 đối tượng trên (SqlConnection, SqlCommand, SqlDataReader, SqlDataAdapter) Provider Oracle, namespace System.Data.Oracle sẽ thêm tiếp đầu ngữ là Oracle vào tên của 4 đối tượng trên. Provider OLEDB, namespace System.Data.OLEDB, sẽ thêm tiếp đầu ngữ là Oledb vào tên của 4 đối tượng trên Provider ODBC, namespace System.Data.ODBC, sẽ thêm tiếp đầu ngữ là Odbc vào tên của 4 đối tượng trên. 6.2. Truy xuất dữ liệu với SQL Server Provider Để truy xuất dữ liệu với SQL Server Provider, ta khai báo sử dụng thư viện Provider của SQL Server bằng câu lệnh khai báo namespace sau: Imports System.Data.SqlClient. 6.2.1. Đối tượng kết nối SQLConnection Bước đầu tiên và quan trọng khi làm việc với CSDL là kết nối từ ứng dụng (chương trình) đến SQL Server. Để thực hiện công việc này, sử dụng đối tượng SqlConnection. Các bước để khai báo đối tượng và thực hiện lệnh kết nối như sau: - Khai báo đối tượng kết nối: Dim cnn As New SqlConnection() - Gán thông tin kết nối: Đối tượng SqlConnection có một thuộc tính quan trọng là ConnectionString (chuỗi kết nối) cung cấp thông tin kết nối như: Tên máy chủ chứa CSDL (Server name), tên CSDL, … cnn.ConnectionString ="Server = Máy_chủ_chứa_CSDL; Database = Tên_CSDL; user=Tên_người_dùng; pwd=Mật_khẩu" Trong SQL Server 2005 khi làm việc với CSDL bạn có thể sử dụng file CSDL dạng Attachment, tức là CSDL là một file duy nhất tách riêng như CSDL của Access, khi ứng dụng chạy nó sẽ gắn file CSDL này vào Engine của SQL Server. 137
  3. Khi ứng dụng kết thúc ta có thể tháo CSDL ra khỏi Engine bằng cơ chế gọi là Detach. Để kết nối CSDL dạng này ta khai báo chuỗi kết nối như sau: cnn.Connectionstring ="Server = Máy_chủ_chứa_CSDL; AttachDbFilename = Tên_CSDL; user=Tên_người_dùng; pwd=Mật_khẩu" Nếu ta đặt thông tin kết nối ngay trong mã chương trình thì sau khi biên dịch người dùng không thể đổi các thông tin này được nữa. Trong thực tế các thông tin kết nối như máy chủ CSDL, tài khoản người dùng thường thay đổi. Vì vậy, ta nên đặt thông tin kết nối trong file cấu hình trong VB.NET. Để thêm file cấu hình (app.config đối với ứng dụng Windows Forms và web.config đối ứng dụng Web Forms), ta chọn Projects/Add New Item, hộp thoại Add New Item xuất hiện, ta chọn mục Application Config file và nhấn nút Add. Sau đó ta thêm đoạn lệnh sau vào file cấu hình
  4. - Truy xuất dữ liệu - Đóng kết nối: cnn.Close() Ví dụ 6.1. Giả sử ta kết nối vào SQL Server 2005 với tên Server (Server name): GhostViet/SQLExpress; User: sa; Password: 190016 để tạo CSDL SQL Server có tên là qltv gồm 3 bảng: Sach(mas, tens, tacgia, nhaxb, namxb), với khoá chính là mas Docgia(madg, tendg, donvi, dienthoai), với khoá chính là madg Muontra(mas, madg, ngaym, ngayht, ngaytra), với các khoá ngoại là mas và madg. Để kết nối đến CSDL qltv ta tạo tệp config.ini lưu thông tin kết nối như sau: Tiếp theo ta khởi động Visual Studio 2005 và tạo một ứng dụng dạng Windows form. Tạo form1 có thuộc tính Text là Doc gia, để thực hiện các thao tác bổ sung, cập nhật, loại bỏ, tìm kiếm dữ liệu trên bảng Docgia trong CSDL qltv. Ta sẽ đưa lên form1 các điều khiển sau: TT Điều khiển Thuộc tính Giá trị 1 Label1 Text Mã độc giả 2 Label2 Text Họ tên độc giả 3 Label3 Text Đơn vị công tác 4 Label4 Text Điện thoại 5 Textbox1 Name Txtma 6 Textbox2 Name Txtten 7 Textbox3 Name Txtdv 8 Textbox4 Name Txtdt 9 DataGridView1 Name DataGridView1 Name btnAdd 10 Button1 Text Add 139
  5. Name btnupdate 11 Button2 Text Update Name Btndel 12 Button3 Text Delete Name btnfind 13 Button4 Text Find Form1 có dạng như sau: Khai báo các namespace và biến toàn cục trong cửa sổ code của form1: Imports System.Data.SqlClient Imports System.Configuration Public Class Form1 Dim cnn As New SqlConnection() 140
  6. „Các thủ tục được viết ở đây End Class Trong sự kiện Load của form1 ta đưa vào các dòng lệnh sau: Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Dim cnn As New SqlConnection() Dim cnnstr As String = My.Computer.FileSystem.ReadAllText("config.ini") cnn.ConnectionString = cnnstr cnn.Open() ht() End Sub Thủ tục ht() dùng để hiển thị dữ liệu trong bảng Docgia trên DataGridView1 như sau: Private Sub ht() Dim da As New SqlDataAdapter("select * from docgia", cnn) Dim tb As New DataTable da.Fill(tb) Me.DataGridView1.DataSource = tb End Sub SqlDataAdapter và DataTable là các đối tượng truy nhập dữ liệu sẽ trình bày ở phần sau. 6.2.2. Thực thi lệnh SQL với SqlCommand Sau khi quá trình kết nối hoàn tất, phần tiếp theo là tương tác với cơ sở dữ liệu phía Server. Ta gửi các câu lệnh SQL đến Server và nhận kết quả trả về. Để thực thi các câu lệnh SQL này ta thực hiện các bước sau: Bước 1. Khai báo đối tượng SqlCommand Dim cmd As SqlCommand Bước 2. Khởi tạo đối tượng Cmd = New SqlCommand Bước 3. Gán kết nối cho đối tượng cmd.Connection = cnn 141
  7. Bước 4. Gán lệnh SQL cho đối tượng cmd.Commandtext = Câu_lệnh_SQL Bước 5. Thực thi câu lệnh SQL cmd.ExecuteReader Có thể viết gọn hơn (gộp 4 bước đầu) bằng cách truyền chuỗi kết nối luôn trong quá trình khởi tạo đối tượng như sau Dim cmd As SqlCommand(Câu_lệnh_SQL, cnn) Có 3 dạng lệnh SQL có thể dùng thông qua đối tượng Sqlcommand, chúng được biểu diễn bằng thuộc tính CommandType với 3 giá trị là: Command.Text, Command.TableDirect, Command.StoredProcedure Một lệnh SQL chỉ được thực thi trong thời gian cho phép , nếu quá thời gian này mà phía Server vẫn chưa hoàn tất thao tác xử lý và trả về kết quả thì lỗi sẽ phát sinh. Lỗi này gọi là lỗi Timeout (hết hạn chờ). Thời gian chờ mặc định là 30 giây, ta có thể thiết lập thời gian chờ bằng câu lệnh gán: cmd.CommandTimeout = Thời_gian_chờ; a) Thực thi câu lệnh Insert Để thêm một bản ghi vào bảng, ta thực hiện các bước sau: Bước 1. Khởi tạo và mở kết nối đến CSDL (cnn) Bước 2. Định nghĩa câu lệnh SQL Insert Dim sqlStr As String = " Insert…." Bước 3. Định nghĩa đối tượng SqlCommand Dim cmd As SqlCommand(sqlStr,cnn) Bước 4. Thực thi câu lệnh SQL cmd.ExecuteNoneQuery Bước 5. Đóng kết nối Cnn.Close() Phương thức ExecuteNoneQuery để thực thi các câu lệnh SQL không yêu cầu trả về tập dữ liệu, nó trả về số bản ghi trong bảng bị tác động bởi câu lệnh SQL. Có thể truyền tham số cho câu lệnh SQL Insert như sau: Dim sqlStr As String = "Insert into Tên_bảng(Danh sách cột) Values (@biến1, @biến2..)" 142
  8. Trong cú pháp trên @biến1, @biến2 là các tham số, trước khi thực thi câu lệnh SQL ta phải tạo và gán giá trị cho các tham số sử dụng phương thức Parameter.Add, thường giá trị của tham số do người dùng nhập từ bên ngoài vào. Quá trình thực thi câu lệnh SQL có thể xảy ra các lỗi như: mất kết nối đường truyền, dữ liệu bổ sung không hợp lệ,..khi đó ta nên dùng lệnh Try/Catch để bắt và sửa lỗi. Để thực hiện câu lệnh SQL Insert bổ sung dữ liệu vào bảng Docgia trong Ví dụ 6.1, ta viết thủ tục sự kiện Click của nút btnAdd trên form1 như sau: Private Sub BtnAdd_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnAdd.Click Dim sqlstr As String = "insert into docgia(madg,tendg,donvi,dienthoai) values(@ma,@ten,@dv,@dt)" Dim cmd As New SqlCommand(sqlstr, cnn) cmd.Parameters.Add("@ma", SqlDbType.NVarChar).Value = Me.txtma.Text cmd.Parameters.Add("@ten", SqlDbType.NVarChar).Value = Me.txtten.Text cmd.Parameters.Add("@dv", SqlDbType.NVarChar).Value = Me.txtdv.Text cmd.Parameters.Add("@dt", SqlDbType.NVarChar).Value = Me.txtdt.Text cmd.ExecuteNonQuery() ht() End Sub b) Thực thi câu lệnh Update Các chương trình thường thông qua câu lệnh Update để cập nhật thông tin mà người sử dụng yêu cầu sửa đổi. Để thực thi câu lệnh Update phục vụ việc cập nhật dữ liệu ta thực hiện các bước sau: Bước 1. Tạo và mở kết nối đến cơ sở dữ liệu Ví dụ: Dim CnnStr As String = "server = (local);database = MyDatabase;userID =sa;pwd =" Dim Cnn As New SqlConnection(CnnStr) Cnn.Open Bước 2. Định nghĩa câu lệnh SQL Update 143
  9. Ví dụ: Dim SqlStr As String = "Update Khachhang Set Dienthoai = '0904666888' where Makh = 'K009'" Bước 3. Định nghĩa đối tượng SqlCommand Ví dụ: Dim cmd As New SqlCommand(SqlStr,Cnn) Bước 4. Thực thi câu lệnh SQL Update sử dụng phương thức ExecuteNoneQuery Ví dụ: Dim int recordAffect = cmd.ExecuteNoneQuery() Trong đó: recordAffect là biến ghi nhận số bản ghi được cập nhật. Bước 5. Đóng kết nối Ví dụ: Cnn.Close() Ta có thể truyền tham số cho câu lệnh SQl Update bằng cách tạo và gán giá trị cho tham số trước khi thực thi câu lệnh SQL Update. Ví dụ: cmd.Parameters.Add("@Dienthoai",SqlDbType.Nvarchar).Value = "0904666888" Ví dụ để cập nhật dữ liệu cho bảng Docgia trong ví dụ 6.1 ta viết thủ tục sự kiện Click cho nút lệnh btnUpdate trên form1 như sau: Private Sub btnUpdate_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnUpdate.Click Dim sqlstr As String = "update docgia set tendg= @ten,donvi= @dv,dienthoai = @dt where madg = @ma" Dim cmd As New SqlCommand(sqlstr, cnn) cmd.Parameters.Add("@ma", SqlDbType.NVarChar).Value = Me.txtma.Text cmd.Parameters.Add("@ten", SqlDbType.NVarChar).Value = Me.txtten.Text cmd.Parameters.Add("@dv", SqlDbType.NVarChar).Value = Me.txtdv.Text cmd.Parameters.Add("@dt", SqlDbType.NVarChar).Value = Me.txtdt.Text cmd.ExecuteNonQuery() ht() End Sub 144
  10. c) Thực thi câu lệnh Delete Câu lệnh SQL Delete dùng để xóa các bản ghi trong một bảng thỏa mãn một điều kiện nào đó. Để thực thi câu lệnh SQL Delete xóa các bản ghi, ta thực hiện các bước sau: Bước 1. Tạo và mở kết nối đến cơ sở dữ liệu Bước 2. Định nghĩa câu lệnh SQL Delete Ví dụ: Dim SqlStr As String = "Delete Khachhang where Tenkh =N'Lê Thanh'" Chữ N trước chữ Lê Thanh trong câu lệnh SQL trên để chỉ dữ liệu dạng Unicode Bước 3. Định nghĩa đối tượng SqlCommand Bước 4. Thực thi câu lệnh SQL Update sử dụng phương thức ExecuteNoneQuery Bước 5. Đóng kết nối Việc thực thi câu lệnh SQL Delete tương tự như đối với câu lệnh SQL Update chỉ khác về câu lệnh SQL. Ví dụ khi ta xoá một bản ghi trên điều khiển DataGridView1, bản ghi đó chỉ bị đánh dấu xoá chứ chưa thực sự bị xoá khỏi bảng Docgia. Để xoá thực sự bản ghi ta viết thủ tục sự kiện Click cho nút btnDel trên form1 trong ví dụ 6.1 như sau: Private Sub btndel_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btndel.Click Dim hoten As String hoten = InputBox("Nhập họ tên độc giả cần xóa") Dim sqlstr As String = "delete docgia where tendg = @ten" Dim cmd As New SqlCommand(sqlstr, cnn) cmd.Parameters.Add("@ten", SqlDbType.NVarChar).Value = hoten cmd.ExecuteNonQuery() ht() End Sub d) Thực thi câu lệnh Select Lệnh SQL Select cho phép ta lấy về một tập dữ liệu gồm các hàng và các cột. Để thực thi câu lệnh này ta thực hiện các bước sau: Bước 1. Tạo và mở kết nối đến cơ sở dữ liệu 145
  11. Bước 2. Định nghĩa câu lệnh SQL Select Ví dụ: Dim SqlStr As String = "Select * from Khachhang where Diachi = N'Nam Định'" Bước 3. Định nghĩa đối tượng SqlCommand Bước 4. Thực thi câu lệnh SQL Select và lấy về tập dữ liệu kết quả Ví dụ: Dim reader As SqlDataReader = cmd.ExecuteReader() Trong đó: SqlDataReader là một bảng dữ liệu chỉ đọc và duyệt một chiều Bước 5. Đóng kết nối Ta cũng có thể truyền tham số cho lệnh SQL Select trước khi thực thi câu lệnh bằng cách dùng đối tượng SqlParameter. Để hiển thị thông tin về độc giả có Họ và tên được nhập từ bàn phím Private Sub btnfind_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnfind.Click Dim hoten As String hoten = InputBox("Nhập họ tên độc giả cần tìm") Dim sqlstr As String = "select * from docgia where tendg = @ten" Dim cmd As New SqlCommand(sqlstr, cnn) cmd.Parameters.Add("@ten", SqlDbType.NVarChar).Value = hoten Dim reader As SqlDataReader = cmd.ExecuteReader() While reader.Read() txtma.Text = reader.GetString(0) txtten.Text = reader.GetString(1) txtdv.Text = reader.GetString(2) If reader.GetValue(3).ToString "" Then txtdt.Text = reader.GetString(3) End While End Sub e) Thực thi thủ tục lưu trữ Để thực thi một thủ tục lưu trữ ta thực hiện các bước sau: 146
  12. Bước 1. Chọn loại câu lệnh SQL bằng cách chỉ định thuộc tính CommandType là Command.StoredProcedure để .NET Provider biết đây là lệnh gọi thủ tục lưu trữ chứ không phải là lệnh SQL. Bước 2. Định nghĩa đối tượng SqlCommand và gán tên thủ tục lưu trữ cần thực thi theo cú pháp: Dim Tên_đối_tượng_cmd As New SqlCommand(Tên_thủ_tục,đối_tượng_kết_nối) Bước 3. Thực thi thủ tục Tên_đối_tượng_cmd.ExecuteNoneQuery() Ví dụ: Tạo thủ tục lưu trữ có tên là Update_KH dùng để cập nhật số điện thoại của khách hàng có tham số là tên khách hàng và số điện thoại được truyền từ bên ngoài. Create procedure Update_KH @TenKH Nvarchar(30),@Dienthoai NvarChar(11) As Begin Update Khachhang Set Dienthoai = @Dienthoai where TenKH = @TenKH End Ta thực thi thủ tục lưu trữ trên như sau Dim CnnStr As String = "server = (local);database = MyDatabase;userID =sa;pwd =" Dim Cnn As New SqlConnection(CnnStr) Cnn.Open Dim cmd As New SqlCommand("Update_KH",Cnn) cmd.Parameters.Add("@TenKH, SqlDbType.Nvarchar).Value= "Lê Thanh" cmd.Parameters.Add("@Dienthoai, SqlDbType.Nvarchar).Value= "0904123456" cmd.ExecuteNoneQuery() 6.2.3. Truyền tham số với SqlParameter Tham số là phần quan trọng của câu lệnh SQL, nó cho phép người dùng tùy biến đưa dữ liệu từ bên ngoài vào và chuyển dữ liệu lên máy chủ SQL lưu trữ. Tham số 147
  13. có thể dùng để lọc dữ liệu, làm điều kiện tìm kiếm, xác định mẩu tin cần cập nhật hay xóa. Để sử dụng tham số cho câu lệnh SQL ta thực hiện các bước sau: Bước 1. Khai báo đối tượng tham số Dim Đối_tượng As SqlParameter Bước 2. Khởi tạo đối tượng tham số Đối_tượng = New SqlParameter Bước 3. Đặt tên cho đối tượng tham số Đối_tượng.ParameterName = Tên_tham_số Bước 4. Định nghĩa kiểu dữ liệu cho tham số Đối_tượng.DbType=Kiểu_dữ_liệu Bước 5. Gán giá trị cho tham số Đối_tượng.Value = Giá_trị Bước 6. Đưa tham số vào đối tượng SqlCommand Đối_tượng_cmd.Add(Đối_tượng) Ta có thể gộp các bước trên để vừa tạo tham số, đưa tham số vào tập hợp và gán giá trị cho tham số theo cú pháp: Dim Thamso As SqlParameter= cmd.Parameter.Add(Tên_tham_số).Value = Giá_trị Các tham số có thể đóng vai trò dữ liệu đầu vào cũng có thể đóng vai trò dữ liệu đầu ra có nghĩa là ta có thể dùng tham số để nhận giá trị trả về. Để một tham số đóng vai trò là tham số đầu ra, ta gán thuộc tính Direction của đối tượng tham số là ParameterDirection.Output 6.2.4. Đọc dữ liệu với DataReader DataReader là khái niệm chung chỉ tập dữ liệu gồm các hàng, các cột gọn nhẹ. Nó được thiết kế để tải dữ liệu nhanh và không cần các thông tin metadata mô tả cấu trúc dữ liệu. Với DataReader ta chỉ có thể duyệt dữ liệu theo một chiều. Khi cần đọc dữ liệu từ DataReader ta sử dụng phương thức Read() và GetValue() như sau: Bước 1. Khởi tạo và mở kết nối CSDL Bước 2. Định nghĩa câu lệnh SQL Select Bước 3. Định nghĩa đối tượng SqlCommand (Giả sử là cmd) Bước 4. Khai báo đối tượng DataReader và nhận tập dữ liệu trả về bằng cách thi hành lệnh SQL Select (giả sử ta dùng reader đặt tên cho đối tượng DataReader) 148
  14. Dim reader As SqlDataReader= cmd.ExecuteReader() Bước 5. Duyệt tập dữ liệu kết quả trả về While reader.Read() 'Đọc giá trị cột ví dụ combobox1.Items.Add(reader.GetValue(1)) End while Bước 5. Đóng đối tượng reader và giải phóng kết nối reader.Close() Phương thức GetValue(i) dùng để đọc giá trị của một cột thứ i ( với i = 0, 1, 2…) là chỉ số cột của bản ghi hiện hành trong tập dữ liệu DataReader. Nếu biết rõ kiểu dữ liệu của cột ta có thể sử dụng các phương thức GetString(), GetInt32(),.. để tăng tốc độ đọc. Để lấy tên cột ta sử dụng phương thức GetName() của đối tượng DataReader Để lấy kiểu dữ liệu của cột ta sử dụng phương thức GetDataTypeName() Để lấy cấu trúc bảng dữ liệu ta sử dụng phương thức GetSchemaTable() ADO.NET 2.0 cho phép ta chứa nhiều tập kết quả trong cùng một đối tượng DataReader. Ví dụ ta có thể thực hiện hai câu lệnh SQL Select liên tiếp và lưu kết quả vào cùng một đối tượng DataReader thay vì phải sử dụng 2 đối tượng DataReader. Khi đó sau khi lấy hết dữ liệu từ tập dữ liệu kết quả thứ nhất, ta dùng phương thức NextResult() để chuyển sang tập dữ liệu kết quả thứ hai. 6.2.5. Tương tác dữ liệu với SQLDataAdapter SqlDataAdapter là đối tượng không lưu trữ dữ liệu, nó chỉ phát đi các câu lệnh SQL và nhận dữ liệu hay kết quả trả về của CSDL, sau đó chuyển cho đối tượng khác (thường là DataTable). SqlDataAdpter nằm trong namespace là System.Data.SqlClient, đối tượng DataTable nằm trong namespace System.Data được coi là thư viện ngầm định của Visual Studio IDE khi biên dịch. a) Trích rút dữ liệu SqlDataAdapter có thể thực hiện cùng một lúc các câu lệnh SQL Select, Insert, Update, Delete. Để trích rút dữ liệu ta thi hành câu lệnh SQL Select từ đối tượng SqlDataAdapter theo các bước sau: Bước 1. Tạo đối tượng DataAdapter 149
  15. Dim da As New SqlDataAdapter() Bước 2. Tạo đối tượng command thực hiện câu lệnh select da.SelectCommand = New SqlCommand() Bước 3. Gán đối tượng kết nối cho đối tượng command da.SelectCommand.Connection = cnn (giả sử là cnn là đối tượng kết nối) Bước 4. Gán câu lệnh Select cho đối tượng command da.SelectCommand.CommandText = "Select …." Bước 5. Tạo đối tượng DataTable để nhận dữ liệu kết quả trả về Dim t as New DataTable Bước 6. Thực thi câu lệnh SQL Select và đổ dữ liệu vào DataTable da.Fill(t) Bước 7. Hiển thị dữ liệu thông qua các điều khiển, chẳng hạn DataGridView DataGridView.DataSource = t Đối tượng DataTable là đối tượng chứa dữ liệu dạng bảng cho phép ta định vị mọi mẩu tin trong bảng thông qua chỉ số tính từ 0. b) Cập nhật dữ liệu Để cập nhật dữ liệu ta trích rút dữ liệu ra đối tượng DataTable hoặc DataSet (chẳng hạn là đối tượng có tên là t) bằng cách thực hiện các bước như trong mục 6.6.1, sau đó gán câu lệnh Update cho đối tượng command sử dụng các tham số như sau: da.SelectCommand.CommandText = "Update …." Bước tiếp theo định nghĩa các tham số, đặt tên tham số, xác định tên cột nhận giá trị tham số, bổ sung tham số vào tập hợp Parameter. Bước cuối cùng gọi phương thức Update từ đối tượng DataAdapter: da.Update(t) Để minh hoạ cho việc sử dụng đối tượng SqlDataAdapter ta tiếp tục ví dụ 6.1 bằng cách bổ sung vào project hiện hành form2 và đưa lên form2 các điều khiển sau: TT Điều khiển Thuộc tính Giá trị 1 DataGridView1 Name Datam_t Name Btndislay 2 Button1 Text Display 3 Button2 Name btnupdate 150
  16. Text Update Viết các thủ tục sự kiện cho các điều khiển như sau: Imports System.Data Imports System.Data.SqlClient Public Class Form2 Dim da As New SqlDataAdapter Dim cnn As New SqlConnection Dim tb As New DataTable „Sự kiện Form2_Load dùng để kết nối dữ liệu và khởi tạo các đối tượng „SqlCommand Private Sub Form2_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Dim p As SqlParameter Dim cnnstr As String = My.Computer.FileSystem.ReadAllText("config.ini") cnn.ConnectionString = cnnstr cnn.Open() „Khởi tạo đối tượng SelectCommand da.SelectCommand = New SqlCommand da.SelectCommand.Connection = cnn da.SelectCommand.CommandText = "select * from muontra" „Khởi tạo đối tượng UpdateCommand da.UpdateCommand = New SqlCommand da.UpdateCommand.Connection = cnn da.UpdateCommand.CommandText = "update muontra set mas=@mas,ngaym=@ngaym,ngayht=@ngayht,ngaytra=@ngayt where madg=@madg" p = New SqlParameter p.ParameterName = "@mas" p.SourceColumn = "mas" da.UpdateCommand.Parameters.Add(p) 151
  17. p = New SqlParameter p.ParameterName = "@ngaym" p.SourceColumn = "ngaym" da.UpdateCommand.Parameters.Add(p) p = New SqlParameter p.ParameterName = "@ngayht" p.SourceColumn = "ngayht" da.UpdateCommand.Parameters.Add(p) p = New SqlParameter p.ParameterName = "@ngayt" p.SourceColumn = "ngaytra" da.UpdateCommand.Parameters.Add(p) p = New SqlParameter p.ParameterName = "@madg" p.SourceColumn = "madg" da.UpdateCommand.Parameters.Add(p) „Khởi tạo đối tượng DeleteCommand da.DeleteCommand = New SqlCommand da.DeleteCommand.Connection = cnn da.DeleteCommand.CommandText = "delete muontra where madg=@madg" p = New SqlParameter p.ParameterName = "@madg" p.SourceColumn = "madg" da.DeleteCommand.Parameters.Add(p) „Khởi tạo đối tượng InsertCommand da.InsertCommand = New SqlCommand da.InsertCommand.Connection = cnn da.InsertCommand.CommandText = "insert into muontra(mas,madg,ngaym,ngayht,ngaytra) values(@mas,@madg,@ngaym,@ngayht,@ngayt)" p = New SqlParameter 152
  18. p.ParameterName = "@mas" p.SourceColumn = "mas" da.InsertCommand.Parameters.Add(p) p = New SqlParameter p.ParameterName = "@madg" p.SourceColumn = "madg" da.InsertCommand.Parameters.Add(p) p = New SqlParameter p.ParameterName = "@ngaym" p.SourceColumn = "ngaym" da.InsertCommand.Parameters.Add(p) p = New SqlParameter p.ParameterName = "@ngayht" p.SourceColumn = "ngayht" da.InsertCommand.Parameters.Add(p) p = New SqlParameter p.ParameterName = "@ngayt" p.SourceColumn = "ngaytra" da.InsertCommand.Parameters.Add(p) End Sub „Thủ tục sự kiện Click của nút lệnh btnDisplay dùng để hiển thị dữ liệu trong bảng „Muontra lên DataGridView có tên là DataM_T. Private Sub btndisplay_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btndisplay.Click da.Fill(tb) DataM_T.DataSource = tb End Sub „Thủ tục sự kiện Click của nút lệnh btnUpdate Private Sub btnupdate_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnupdate.Click da.Update(tb) 153
  19. MsgBox("Dữ liệu đã được cập nhật") End Sub End Class 6.3. Các đối tượng dữ liệu Chúng ta đã tìm hiểu các đối tượng SqlConnection, SqlCommand, SqlParameter, SqlDataAdapter để trích rút, cập nhật dữ liệu, trong mục này chúng ta sẽ tìm hiểu các đối tượng dữ liệu giúp chúng ta lập trình phía ứng dụng, chúng là những đối tượng độc lập với CSDL và không phụ thuộc vào .NET Provider. Đối với ADO.NET mỗi khi có nhu cầu về dữ liệu chương trình sẽ kết nối với CSDL, truy vấn dữ liệu, sau đó ngắt kết nối. Dữ liệu được đem về ứng dụng xử lý. Nếu có nhu cầu cập nhật hoặc thêm mới quá trình kết nối được thiết lập lại và dữ liệu được chuyển lê máy chủ CSDL xử lý, xử lý xong lại ngắt kết nối mô hình hoạt động này được gọi là Disconnected, ưu điểm của nó là CSDL có thể phục vụ được nhiều ứng dụng đồng thời. 6.3.1. DataSet Đối tượng DataSet nằm trong namespace System.Data, để làm việc với DataSet trước tiên ta khai báo đối tượng DataSet như sau: Dim Tên_đối_tượng As DataSet Ví dụ: Dim ds As DataSet Cũng có thể vừa khai báo vừa tạo ra đối tượng mới như sau: Dim Đối_tượng As New DataSet() DataSet bao gồm một tập các bảng dạng DataTable, để truy xuất hoặc thêm bảng mới vào tập hợp, ta dùng thuộc tính Tables của DataSet. Ngoài ra DataSet còn có các phương thức sau để ta có thể thêm, xóa, tham chiếu đến đối tượng DataTable trong DataSet như sau: + Add: Là phương thức cho phép ta thêm một đối tượng DataTable vào đối tượng DataSet. Ví dụ: Dim Ds As New DataSet Dim t As New DataTable("Employee") 154
  20. Ds.Tables.Add(t) + Remove: Là phương thức cho phép ta xóa một đối tượng DataTable khỏi đối tượng DataSet Ví dụ: Ds.Tables.Remove(t) Hoặc Ds.Tables.Remove("Employee") + RemoveAt: Là phương thức cho phép ta xóa một đối tượng DataTable khỏi đối tượng DataSet bằng cách chỉ ra chỉ mục (chỉ số) của DataTable trong DataSet Ví dụ: Ds.Tables.Remove(0) + Clear: Là phương thức cho phép ta xóa tất cả các đối tượng DataTable khỏi đối tượng DataSet Ví dụ: Ds.Tables.Clear() + CanRemove: Là phương thức trả về giá trị True nếu tham số ứng với đối tượng DataTable đang tồn tại có thể cho phép loại bỏ chúng trong đối tượng DataSet. + Contains: Là phương thức cho phép kiểm tra đối tượng DataTable có tồn tại trong đối tượng DataSet hay không. Nếu muốn biết số đối tượng DataTable tồn tại trong đối tượng DataSet ta dùng thuộc tính Count. 6.3.2. DataTable DataTable là đối tượng được khai báo trong namespace System.Data, để làm việc với DataTable ta khai báo namespace như sau: Imports System.Data Để tạo đối tượng DataTable ta khai báo và khởi tạo đối tượng như sau: Dim t As New DataTable Ta cũng có thể khởi tạo đối tượng DataTable và đặt tên cho đối tượng như sau: Dim t As New DataTable(Tên_đối_tượng) 155
nguon tai.lieu . vn