Nh ững thành phần sẽ nghiên cứu trong bài viết này: + Đối tượng SqlConnection + Đối tượng SqlDataAdapter + Đối tượng bảng dữ liệu và bảng view dữ liệu +Mô hình hi ển thị tổng quát 1
Trang 1I.Các đối tượng cơ bản của ADO.Net
Không cần quá dài dòng Đối tượng này thực chất là các thư viện (lib) dưới dạng tích hợp
sẵn hoặc là các file dll của Visual Studio Nó được thiết kế để tăng tốc độ truy cập và
thao tác trên dữ liệu trong môi trường đa lớp Có thể tác động đến các kiểu cơ sở dữ liệu
như SQL , Access,Oracle v v
Vấn đề nó tăng tốc thế nào thì ta kóc quan tâm Chủ yếu , ta sẽ đi học cách sử dụng
các đối tượng con trong nó để thao tác với cơ sở dữ liệu mà thôi
Th ế nào là cơ sở dữ liệu ? thế nào là đối tượng ? Dot net là gì ? Visual Basic.Net ?
v v là những câu hỏi không được trả lời trong mục này Vì khi đụng đến phần này , yêu
cầu các bạn newbie đã phải nắm được các khái niệm trên.Có thể tham khảo sơ lược về
Dot net và về khái niệm lập trình hướng đối tượng tại đây:
http://hvktqs.com/forum/showthread.php?tid=46 Còn về cơ sở dữ liệu và đặc biệt là SQL
thì hẹn gặp lại ở chuyên mục khác
Nh ững thành phần sẽ nghiên cứu trong bài viết này:
+ Đối tượng SqlConnection
+ Đối tượng SqlDataAdapter
+ Đối tượng bảng dữ liệu và bảng view dữ liệu
+Mô hình hi ển thị tổng quát
1.K ết nối từ Visual Basic.Net vào Cơ Sở Dữ Liệu của SQL:
Trước tiên hết , trước khi muốn làm điều gì đó với cơ sở dữ liệu của bạn , điều quan trọng
là phải kết nối được vào cơ sở dữ liệu đó
SqlServer sau khi cài đặt ,nó tạo cho người sử dụng một server (máy chủ) , thông thường
là tại chính máy của người sử dụng Tại server này , người sử dụng có thể tạo ra các kho
thông tin dữ liệu (database) của mình để mà quản lý
Vì sao c ứ phải tạo ứng dụng tác động đến csdl làm gì ?
Người sử dụng phần mềm hok có bít cách vào Sqlserver và gõ các câu lệnh để tác động đến csdl như chúng ta Họ chỉ biết kích chuột , nhìn , kích chuột tiếp , nhận được kết
quả hết !Vì vậy ta phải tạo một ứng dụng để họ có thể sử dụng một cách trực quan nhất
Ta bắt đầu đi vào đối tượng đầu tiên :
Đối tượng SqlConnection
Trang 2Đối tượng SqlConnection chứa trong nó 2 cái rất quan trọng là thuộc tính:
+ConnectionString là thuộc tính trả về giá trị là một chuỗi kí tự Chuỗi này có nhiệm vụ
dẫn đường đến cơ sở dữ liệu mà ta muốn tác động đến.Chuỗi đường dẫn này có dạng như
sau : "server=Tên_server;database=Tên_Database;Ki ểu_Kết_Nối"
Trong đó Kiểu kết nối có thể là :
integrated security =SSPI => kết nối ủy quyền windows
acc=tên_user;pwd=chu ỗi_password => kết nối có account
Ví dụ tớ truy cập vào server nhà tớ , có tên là KHANH\KHANH , cần truy cập vào cơ sở
dữ liệu quanlynhansu và kiểu kết nối là uỷ quyền windows thì tớ sẽ viết như sau :
"server=KHANH\KHANH;database= quanlynhansu;integrated security =SSPI"
Đương nhiên khi khai báo thì phải mô tả rõ đối tượng.Đầu tiên ta khai báo một biến mang
tên bienketnoi thuộc về đối tượng ConnectionString để có thể sử dụng thuộc tính kết nối
của nó :
Dim bienketnoi as new ConnectionString()
Rồi mới sử dụng thuộc tính:
bienketnoi.ConnectionString="server=KHANH\KHANH;database=
quanlynhansu;integrated security =SSPI"
+Ph ương thức Open():
OK rồi , sau khi đã có đường dẫn kết nối đến cơ sở dữ liệu , ta gọi phương thức Open()
của đối tượng kết nối để mở đường kết nối theo đường đã khai báo :
Trang 3Đối tượng này có thể hiểu là bộ chuyển đổi dữ liệu từ đinh dạng của SQL sang dạng dữ
liệu của Visual Studio , để có thể hiển thị dữ liệu trên Visual Studio.Để có thể lấy dữ liệu
từ SQL , nó cần một đường dẫn dẫn đến cơ sở dữ liệu cần chuyển đổi (đương nhiên , kô
biết chuyển ở đâu thì làm sao chuyển ? ) và một dạng lệnh SQL để có thể chuyển đổi dữ
liệu theo yêu cầu nhất định:
Dim da as new SqlDataAdapter(“chu ỗilệnh”,biến_KN.ConnectionString)
Ví dụ , cần lấy tất cả dữ liệu từ bảng tblA để chuyển sang dữ liệu của VS với điều kiện
bảng A nằm ở server KHANH\KHANH , trong cơ sở dữ liệu quanlynhansu , ta khai báo
bộ chuyển đổi như sau :
Dim da as new SqlDataAdapter(“select * from tblA”,bienketnoi.ConnectionString)
với biến kết nối bienketnoi lấy từ ví dụ trước
Sau khi đã có được khối dữ liệu lưu trữ trong da Muốn đem ra để hiển thị , ta cần đổ dữ
liệu ra một cái kho chuyên lưu trữ dữ liệu dạng bảng của VS đã cho sẵn mang tên
DataTable.Trước khi sử dụng DataTable , ta hãy khai báo nó
Dim tb as new DataTable
Để đổ dữ liệu vào tb , ta dùng phương thức Fill của da:
da.Fill(tb)
Và cuối cùng Trước khi hiển thị , ta hãy tìm hiểu đối tượng DataGrid của VisualStudio
Chọn đối tượng này từ bảng Toolboxs , kéo thả vào trong Form ( nếu chưa có thì ta phải
add từ Choose ToolBox Items).Đối tượng này có thuộc tính DataSource , chuyên dùng để
nhận lấy dữ liệu từ DataTable hoặc DataSet( cái này sẽ bàn đến ở phần sau).Ngoài ra còn
có đối tượng DataGridView , cho phép hiển thị bảng dữ liệu và add các mini tools box
bên trong nó Cuối cùng là đối tượng ListView , cho phép hiển thị dữ liệu dưới dạng list
liệt kê
Sau khi thả đối tượng DataGrid vào , đặt tên là DataGrid1 , ta viết tiếp :
Trang 4DataGrid1.DataSource = tb;
Đương nhiên sau khi có dữ liệu trong DataSource , nội dung sẽ output ra ngoài của
DataGrid1 Sau đây là một ví dụ:
Mã PHP:
Dim da As New SqlDataAdapter ( "select * from dssv" , Form1 bienketnoi )
Dim tb As New DataTable
da Fill ( tb )
DataGrid1 DataSource = tb
Kết quả hiển thị khi thực thi:
Nh ư vậy ,ta có một mô hình hiển thị tổng quát là :
Ở phần tới , ta sẽ bàn đến đối tượng SqlCommand , với cách thực thi sâu sắc hơn cho đối
tượng SqlDataAdapter
3.SqlCommand
+Vì sao ph ải dùng SqlCommand? Ta có thể truyền câu lệnh thông qua
SqlDataAdapter c ơ mà ?
Hờ hờ , đúng là thế Nhưng nếu câu lệnh cần tùy biến thì seo , tức là câu lệnh cần
truyền là dạng có tham số đầu vào ta sẽ phải làm thế nào giờ Do đó cần phải có đối
tượng riêng để xử lý cho tình huống đại loại như thế !
Trang 5SqlCommand là đối tượng như thế nào ?
Hình ảnh phát nhỉ
Ở đây , nó có 3 thuộc tính cơ bản là :
Connection : dùng để chỉ rõ lệnh này sẽ tác động đến cơ sở dữ liệu nào , ở đâu
CommandText : trả về chuỗi câu lệnh mà ta cần viết
CommandType : trả về dạng câu lệnh mà ta viết ở CommandText, nếu dạng câu lệnh ở
CommandText là dạng lệnh thông thường thì sẽ trả về CommandType.Text, nếu dạng
lênh ở CommandText là dạng thủ tục thì sẽ trả về CommandType.StoredProcedure
Ví dụ : muốn định nghĩa một lệnh đọc toàn bộ các dòng từ một bảng, vẫn dùng biến kết
nối như ở phần 2 Ta có thể viết:
Mã PHP:
Dim sc As New SqlCommand ()
sc Connection = bienketnoi
sc CommandText = "select * from tblA"
sc CommandType = CommandType Text
Dịch nghĩa : ta có một đối tượng sc là một đối tượng lệnh , sẽ thực thi lệnh được dẫn đường bởi bienketnoi, nội dung câu lệnh là select * from tblA và dạng của câu lệnh này
là dạng Text
Tiếp theo , ta lại viết một store procedure hienthitblA với nội dung là select * from tblA
và lúc gọi thủ tục này bằng SqlCommand thì có thể viết là :
Trang 6Mã PHP:
Dim sc As New SqlCommand ()
sc Connection = bienketnoi
sc CommandText = "hienthitblA"
sc CommandType = CommandType StoredProcedure
Dịch nghĩa : ta có một đối tượng sc là một đối tượng lệnh , sẽ thực thi lệnh được dẫn đường bởi bienketnoi, nội dung câu lệnh là hienthitblA và dạng của câu lệnh này là dạng
Dim sc as new SqlCommand ( "hienthitblA" , bienketnoi )
sc CommandType = CommandType StoredProcedure
N ếu lệnh thực thi với mục đích hiển thị:
Ta sẽ sử dụng SqlCommand để truyền vào cho SqlDataAdapter, lí do truyền tương thích
vì bản thân SqlCommand đã bao hàm bienketnoi và câu lệnh rồi, nên hoàn toàn truyền
cho SqlDataAdapter được
Mã PHP:
Dim sc as new SqlCommand ( "hienthitblA" , bienketnoi )
sc CommandType = CommandType StoredProcedure
Dim da As New SqlDataAdapter ( sc )
Dim tb As New DataTable
da Fill ( tb )
DataGrid1 DataSource = tb
Khi th ủ tục có tham số:
Lúc này ta dùng đến lớp đối tượng con Parameters (tham số) của SqlCommand , nó có
chứa phương thức AddWithValues để đưa nội dung vào cho tham số của thủ tục
Ví dụ ta có 1 store procedure thế này:
Trang 7Và giả sử tiếp 2 tham số lấy từ 2 textbox.Vậy thì ta sẽ sử dụng đối tượng sc như sau
Mã PHP:
Dim sc as new SqlCommand ( "insert_tblA" , bienketnoi )
sc CommandType = CommandType StoredProcedure
sc Parameters AddWithValue ( "@bien1" , textbox1 text )
sc Parameters AddWithValue ( "@bien2" , Integer Parse ( textbox2 text ))
sc ExecuteNonQuery ()
Lí do phải đổi textbox2.text sang dạng integer vì kiểu của bien2 là kiểu integer.Còn
phương thức ExcuteNonQuery() để thực hiện câu lệnh sc mà không cần đưa ra hiển thị
nào Lí do vì đây là thủ tục insert_tblA được thực hiện, chỉ với mục đích chèn vào bảng
tblA, nên không cần dùng đến da để đưa hiển thị ra ngoài
Như vậy , tổng quát của AddWithValue là:
sc.Parameters.AddWithValue("@tên_bi ến", giá trị tương ứng)
Ở lần này , ta sẽ bàn đến những chiêu thức cơ bản của lập trình CSDL:
Và bàn đến kĩ thuật điều khiển DataGridView thông qua bắt sự kiện:
+Nh ấp chuột vào DataGridView để lấy thông tin
+Ch ỉnh sửa trực tiếp dữ liệu trên DataGridView và tự động cập nhật lại csdl
I.Update,Insert,Delete,Search,Enumerati
on
1.Ôn t ập đôi chút về Command SQL
Ta lần lượt trải nhanh qua vài bước như sau:
Một số ghi chú:
SEM = SQL Sever EnterpriseManager
SQA = SQL Query Analyzer
B ước 1:
Câu l ệnh create
Create table tên_b ảng (tên_cột_1 kiểu_cột_1,…,tên_cột_n kiểu_cột_n)
Trang 8Câu lệnh cho phép tạo một bảng nằm trong một CSDL tương ứng.Sau đó các bạn quay lại
SEM để xem và nhập các dữ liệu vào các cột
chọn vào CSDL mà bạn vưà tạo (1) rồi chọn đến ô chứa các bảng (2) rồi kích tiếp chuột
phải vào bảng vừa tạo (3) rồi chọn đến Return all rows (4)
Tại đây bạn nhập các dữ liệu như làm với Microsoft Excel vậy !
Câu l ệnh select:
Quay trở lại SQA để thực hiện tiếp một số câu lệnh sau…
Trang 91 Select * from tên_b ảng : Hiển thị tất cả các cột trong bảng
2 Select tên_c ột_1,…,tên_cột_n from tên_bảng: Hiển thị một số cột nào đó trong
b ảng
3.select tên_c ột_1,…,tên_cột_n from tên_bảng
where điều_kiện_logic :Hiển thị các cột phụ thuộc theo điều kiện logic đã chọn
tr ước.
Trang 10Điều kiện logic nếu là chữ thì bạn phải thêm dấu ’’ vào hai đầu của chữ cần so sánh trong điều kiện logic
B ước 2:Các câu lệnh quan trọng trong SQL
Câu l ệnh insert
Mã PHP:
insert into tên_b ả ng ho ặ c insert into tên_b ả ng
( ộ t_1 , , ộ t_n ) ( c ộ t_1 , ,
ộ t_n ) values valu
es (@ bi ế n_1 , ,@ bi ế n_n ) ( giá_tr ị _1 , , giá_tr
ị _n )
Câu lệnh cho phép điền thêm giá trị vào bảng, giá trị có thể là biến ( kí hiệu đối với SQL
là @tên_biến ) hoặc có thể là giá trị cụ thể, nhưng cần chú ý là các giá trị được điền vào
phải phù hợp với kiểu dữ liệu của cột
Ví dụ như cột stt có kiểu integer thì ta không thể điền chữ ‘a’ vào đó được…
Trang 11Với kiểu dùng thứ 1 ta cần phải truyền các giá trị vào thông qua các biến
Ở đây tớ cố tình khai báo tên các biến khác hẳn với tên các cột để các bạn thấy tên biến
có thể đặt bất kì , không cứ phải trùng với tên cột…
Câu l ệnh delete
Delete from tên_b ảng Where điều_kiện_logic
Câu lệnh cho phép xoá một dòng hoặc một số dòng nào đó trong bảng mà những dòng
này thoả mãn điều_kiện_logic Còn nếu không có câu lệnh where thì nghĩa là dòng nào
cũng thoả mãn … => xoá hết các dòng , chỉ để trơ lại mỗi tên cột !Theo dõi bảng trước và
sau khi xoá:
Trang 12Điều kiện logic trong câu lệnh trên là soID>=23 , nghĩa là cứ dòng nào thoả mãn có cột
Câu lệnh cho phép cập nhật dữ liệu của 1 hay nhiều dòng trên 1 hay nhiều cột tại nơi có
điều kiện logic xẩy ra.Theo dõi trước và sau khi Update:
Tại nơi có soID=9 thì dữ liệu hodem và ten tương ứng tại đó đươc thay đổi thành ‘eee’
Trang 13Một thủ tục có thể có biến truyền vào hoặc không có biến truyền vào
Ví dụ xây dựng một thủ tục không có tham số truyền :
Ví dụ khác về thủ tục có tham số truyền:
Ở thủ tục này , các giá trị 5,’ggg’,’ggg’,20 lần lượt được truyền vào cho
@stt,@hodem,@ten,@soID khi gọi exec tên_thủ_tục
Như vậy cách thực hiện gọi thủ tục là :
Exec tên_thủ_tục giá_trị_1,…,giá_trị_n
Với giá_trị_1,…,giá_trị_n sẽ được lần lượt truyền cho @biến_1,…,@biến_n
2.T ập làm quen với thêm sửa xóa đơn giản vời điều khiển datagridview
Vậy , thông qua phần trên , ta có thể thấy việc thêm sửa xóa khá đơn giản, chỉ là tạo một
số thủ tục , với các biến truyền vào là biến muốn tác động,thay đổi thêm bớt mà thôi, rồi
sau đó gọi các đối tượng cơ bản của ADO.NET ra để khai thác thủ tục
Việc thêm vào khá đơn giản, như phần giới thiệu về đối tượng SqlCommand đã đưa ra ví
dụ Còn việc sửa và xóa, tớ xin được giới thiệu một kĩ thuật điều khiển datagridview một
cách tự biên tự diễn
Trang 14a Điều khiển DataGridView
Mục tiêu của việc điều khiển để nhằm thực hiện thao tác : đưa chuột lên dòng cần xóa,
sửa trên Datagridview, nhấn nút xóa hoặc chọn giá trị cần sửa đã được hiển thị ra sau khi
nhấn nút cập nhật thì cơ sở dữ liệu trong Sql cũng được cập nhật lại thông tin
Để làm như thế, trước hết ta cần phải bắt được dòng vừa click vào datagridview bằng một
biến donghientai kiểu integer :
donghientai = DataGridView1.CurrentRow.Index
rồi trích chọn giá trị của Datagridview tại một ô i nào đó bằng cách :
dim s as string = DataGridView1.Rows(donghientai).Cells(i).Value.ToString()
b.M ột ví dụ về thêm sửa xóa lợi dụng điều khiển DataGridView
Thông qua việc điều khiển DataGridView nêu trên , ta đã có thể mường tượng ra việc sửa
(update) hoặc xóa(delete) cho một dòng trên bảng dữ liệu
Giả sử ta có bảng dữ liệu bang1, gồm 2 cột : cot1 kiểu int, cot2 kiểu nvarchar(50) Ta xây
dựng các thủ tục store procedure cho nó:
Thủ tục này được truyền thêm biến @gtcot để nhằm tìm đến giá trị của cột 1 trước đó mà
trước khi nó bị thay đổi Việc có thêm biến này do đặc trưng của câu lệnh Vì giả sử cả 2
cột cùng bị thay đổi thì ta biết dựa vào đâu để mà tìm đến dòng của nó mà thay giá trị
mới Nên cần biến này để nhớ giá trị trước khi bi thay đồi
Trang 15delete from bang1
where bang1 cot1 =@ bien
với kiểu giao diện như trên , ta có thể code cho sự kiện cell_click của datagridview là:
Mã PHP:
Dim donghientai , bienxoa , bienupdate As Integer
Private Sub DataGridView1_CellClick ( ByVal sender As System Object , ByVa
l e As System Windows Forms DataGridViewCellEventArgs ) Handles DataGrid View1 CellClick
donghientai = DataGridView1 CurrentRow Index
bienxoa = Integer Parse ( DataGridView1 Rows ( donghientai ) Cells ( ) Value ToString ())
bienupdate = bienxoa
TextBox1 Text = bienxoa ToString ()
TextBox2 Text = DataGridView1 Rows ( donghientai ) Cells ( ) Value
ToString ()
End Sub
Textbox1,2 là textbox trong group của nút sửa sẽ hiển thị nội dung của dòng được click
vào trên datagridview, cho phép ta sửa nội dung trên các textbox này
Trang 16Nút sửa :
+bắt lấy giá trị trước khi bị sửa của cột 1 và lưu lại
+gọi thủ tục sửa cho cả 2 cột với giá trị từ textbox 1,2 tại vị trí giá trị vừa lưu
Mã PHP:
Dim sc As New SqlCommand ( "update_bang1" , bkn )
sc CommandType = CommandType StoredProcedure
sc Parameters AddWithValue ( "@gtcot" , bienupdate )
sc Parameters AddWithValue ( "@cot1" , Integer Parse ( TextBox1 Text
))
sc Parameters AddWithValue ( "@cot2" , TextBox2 Text )
sc ExecuteNonQuery ()
Nút xóa:
+bắt lấy giá trị của cột 1 dòng bị xóa và lưu lại
+gọi thủ tục xóa cho dòng tại giá trị vừa lưu
Mã PHP:
Dim sc As New SqlCommand ( "delete_bang1" , bkn )
sc CommandType = CommandType StoredProcedure
sc Parameters AddWithValue ( "@bien" , bienxoa )
sc ExecuteNonQuery ()
Nút Insert:
+Gọi form mới,gồm 2 textbox để nhập giá trị mới
+Có điều khiển dữ liệu cho textbox 1 luôn nhập vào với giá trị số
+Gọi thủ tục insert với 2 giá trị ghi trên textbox này
+Code: Khỏi nói
Thủ tục hiển thị:
+Để linh hoạt ta sẽ xây dựng cho nó truyền vào 1 datagridview và 1 biến kết nối
+Datagridview thì cần truyền kiểu ByRef vì sẽ thay đổi tham chiếu đến datagridview mà
Để làm cho việc lập trình cơ sở dữ liệu được nhanh chóng và công nghiệp, kèm theo tính
chuyên nghiệp của lập trình Mô hình 3 lớp ra đời phục vụ cho mục đích này!
Trước khi bước vào phần này, các bạn hãy đọc kĩ lại các phần ở trang trước để nắm bắt
cụ thể các đối tượng cơ bản của ADO.NET
Ok, rồi, giờ ta bắt đầu với mô hình 3 lớp: