Tác giả: vuathongtin
Cấp độ bài viết: Cơ Bản
Tóm tắt:
Các khái nhiệm :
Datatable : giống như table trong file access, mọi thao tác (thêm, xóa, sửa,.. ) được thực hiện trên datatable rùi mới đưa vào file nguồn ---> datatable là bảng (table) dữ liệu trung gian.
Datatable gồm : datarow, dataset,....
Dữ liệu từ table của file nguồn được kết nối bởi Connection, sau đó đc đổ vào datatable (hoặc các thành phần trong datatable) thông qua DataAdapter.
Lấy ví dụ cho dễ hiểu nha :
Bạn chỉ cần tưởng tượng rằng : bạn có một cái bể nước (DataSource) , một cái máy bơm (DataAdapter) và một cái thùng đựng nước (DataSet). Thì khi lấy nước dùng cái bơm lấy nước từ bể, kiểm tra và lọc nước sau đó lại dùng cái bơm hút lại về cái bể nước. Đó chính là vai trò của cái bơm và DataAdapter tương tự như vậy.
--> Mình chỉ ghi theo những j mình hiểu thôi nên cũng ko chính xác lắm.
CSDL làm ví dụ : http://www.mediafire.com/?ntn0rmtmzdt
1. Khai báo
Namespace chỉ để kết nối Access
hoặc
Biến toàn cục :
Dim da As New OleDbDataAdapter
Dim dt As New DataTable
2. Kết nối với CSDL :
con.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" & " data source= " & Application.StartupPath & "\QUAN_LY_SINH_VIEN.mdb"
con.Open()
End Sub
--> QUAN_LY_SINH_VIEN.mdb là CSDL cần kết nối
Chú ý : Bạn muốn biết Provider của CSDL bạn dùng là gì bạn nên vào trang http://www.connectionstrings.com/để tìm hiểu
3. Load dữ liệu vào datatable, datagridview,...
' kiểm tra kết nối
If con.State = ConnectionState.Open Then ' hoặc : con.State = 1
MsgBox("Thanh cong")
End If
da = New OleDbDataAdapter("Select * from SINHVIEN", con)
da.Fill(dt)
DataGridView1.DataSource = dt
4. Next, Previous, Last, First, Count
Cách 1 : Dùng "BindingContext "
Me.BindingContext.Item(dt).Position = Me.BindingContext.Item(dt).Position + 1
' Previous
Me.BindingContext.Item(dt).Position = Me.BindingContext.Item(dt).Position - 1
' Last
Me.BindingContext.Item(dt).Position = Me.BindingContext.Item(dt).Count - 1
' First
C1: DataGridView1.CurrentCell = DataGridView1.Item("tên hàng", 0)
ví dụ : DataGridView1.CurrentCell = DataGridView1.Item("MSSV", 0)
C2: Me.BindingContext.Item(dt).Position = 0
'Trỏ đến vị trí mới nhập
DataGridView1.CurrentCell =DataGridView1.Item("Tên cột sẽ chọn trên dòng", "chỉ số dòng mới chèn vào")
Ví dụ : trỏ đến dòng thứ 20 của cột MSSV
DataGridView1.CurrentCell = DataGridView1.Item("MSSV", 20)
' Count
lbl_tongso.Text = "Tổng số : " & Me.BindingContext.Item(dt).Count.tostring
hoặc :
lbl_tongso.Text = "Tổng số : " & Me.dt.Rows.Count.tostring
hoặc :
lbl_tongso.Text = "Tổng số : " & Me.dt.DefaultView.Count.tostring
Chú ý : dt là khai báo của datatable
Cách 2 : Dùng "Bindingsource"
ví dụ : Khi viết code cho button " Next"
binding.DataSource = dt
DataGridView1.DataSource = binding
binding.MoveNext()
--> Ý nghĩa : BindingSoure cung cấp các giao thức "MoveNext, MoveFirst,.." , ta chỉ việc khai báo datasource của DataGridView1 gián tiếp với dt thông qua Bindingsource là sử dụng đc các giao thức đó
Những cái kia viết tương tự .....
5. Tìm kiếm
Cách 1 : Dùng SQL " Lọc với điều kiện cho trước"
Cú pháp :
- Mã: Chọn tất cả
Select <tên field> from <tên table> where <điều kiện>
5.1.1. Dùng phép so sánh =
da.Fill(dt)
DataGridView1.DataSource = dt
5.1.2. Dùng Hàm Instr
Hàm InStr() trả về vị trí của ký tự (nhóm ký tự) đầu tiên được truyền vào trong chuối String.
Ví dụ :
InStr(doan_van,"T")
' Ở đây, chữ "T" được tính là chữ "T" của chữ: "Tro".
5.1.3. Dùng toán tử LIKE
Cú pháp :
- Mã: Chọn tất cả
"Select * from CV where NOIDUNG LIKE '%" & txtTimKiem.Text & "%'"
Cách 2 : Dùng chức năng "RowFilter" trong datatable
Cú pháp :
Ví dụ :
dt.DefaultView.RowFilter= chuoiloc
Ngoài ra nếu datagridview được kết nối qua một bindingsource thì có thể phương thức "Filter" của BindingSource .
Ví dụ :
binding.DataSource = dt
DataGridView1.DataSource = binding
binding.Filter = String.Format("Ten like '{0}%'", txtsearchstr.Text)
6. Thêm
Lấy form tạo người dùng làm ví dụ
tbl_nguoidung : nguoidung, matkhau
6.1. Phương pháp 1 : Chậm mà chắc
B1 : Kiểm tra kết nối và đổ (fill) dữ liệu từ nguồn vào datatable ---> Ta đã có 1 table ( bước này có khi ko dùng đến)
B2 : Khai báo 1 Row (dòng) mới vào dt (datatable), và add dữ liệu vào Row theo cấu trúc row trong (datatable)
Dim row As DataRow = dt.NewRow
' Add du lieu vao cau truc Row
row("nguoidung") = txt_tennguoidung.Text
row("matkhau") = txt_matkhau.Text
dt.Rows.Add(row)
B3 : Dùng Command để update vào file nguồn
Dim commandtao As New OleDb.OleDbCommand()
commandtao.Connection = frm_dangnhap.con
commandtao.CommandType = CommandType.Text ' Loại lenh su dung la Text
commandtao.CommandText = "Insert into tbl_nguoidung values (@nguoidung,@matkhau)"
' Truyen tham so vao cac values
commandtao.Parameters.Add("@nguoidung", OleDb.OleDbType.VarChar, 30, "nguoidung")
commandtao.Parameters.Add("@matkhau", OleDb.OleDbType.VarChar, 20, "matkhau")
' Dùng da để thực thi những thay đổi vào file nguồn
da.InsertCommand = commandtao
da.Update(dt)
6.2 . Phương pháp 2 : Nhanh cho mau thấy, không cần biết hậu quả
B1, B2 : tương tự phương pháp 1
B3 : Dùng CommandBuilder để làm da thực thi nhưng thay đổi vào file nguồn
cb = New OleDbCommandBuilder(da)
da.Update(dt)
cb.Dispose()
Ngoài ra có thể Insert dựa vào dataset
7. Sửa :
B1 : Tương tự như Thêm
B2 : Khai báo
Dim row As DataRow = frm_dangnhap.dt_nguoidung.Select("nguoidung = '" & frm_dangnhap.txt_nguoidung.Text & "'")(0)
row.BeginEdit()
row("matkhau") = txt_matkhaumoi.Text
row.EndEdit()
B3 : Tương tự B3 của 6.2
cb = New OleDbCommandBuilder(da)
da.Update(dt)
cb.Dispose()
Ngoài ra B2 có thể làm tương tự như B2 của 6.1 (chậm mà chắc)
Dim commandtao As New OleDb.OleDbCommand()
commandtao.Connection = frm_dangnhap.con
commandtao.CommandType = CommandType.Text ' Loại lenh su dung la Text
commandtao.CommandText = "Update tbl_nguoidung set nguoidung=@nguoidung,matkhau=@matkhau"
' Truyen tham so vao cac values
commandtao.Parameters.Add("@nguoidung", OleDb.OleDbType.VarChar, 30, "nguoidung")
commandtao.Parameters.Add("@matkhau", OleDb.OleDbType.VarChar, 20, "matkhau")
' Dùng da để thực thi những thay đổi vào file nguồn
da.UpdateCommand = commandtao
da.Update(dt)
Giải thích :
8. Xóa :
B1 : Tương tự như Thêm
B2 :
Dim row As DataRow = frm_dangnhap.dt_nguoidung.Select("nguoidung = '" & frm_dangnhap.txt_nguoidung.Text & "'")(0)
row.BeginEdit()
row.delete()
row.EndEdit()
B3 : Tương tự B3 của 6.2
cb = New OleDbCommandBuilder(da)
da.Update(dt)
cb.Dispose()
Cách 2 : Thực thi trực tiếp câu lệnh SQL
cmd = New OleDbCommand("Delete * from tbl_nguoidung where (nguoidung='" & txt_nguoidung.Text & "')", con)
cmd.ExecuteNonQuery()
row.delete()
Chỉ cần viết 1 thủ tục Thực thi trực tiếp command thông qua lệnh ExecuteNonQuery()
ta có thể insert, update hoặc delete 1 cách dễ dàng . 1 thủ tục làm nhiều công việc
cmd = New OleDbCommand(chuoitruyvan, con)
cmd.ExecuteNonQuery()
End Sub
Chú thích :
- con là biến toàn cục ( đã khai báo ở trên)
- Chuoitruyvan là lệnh SQL
Ví dụ :
Dim chuoitruyvan2 As String = "update NhanVien set MaNV='" & txt_ma.Text & "',Ho='" & txt_ho.Text & "',Ten='" & txt_ten.Text & "' where MaNV='" & txt_ma.Text & "'"
Dim chuoitruyvan3 as string="delete * from NhanVien where MaNV='" & txt_ma.Text & "'"
them(chuoitruyvan1,con) ' Thêm dữ liệu
them(chuoitruyvan2,con) ' Update lại dữ liệu
them(chuoitruyvan3,con) ' Xóa dữ liệu tại vị trí mã được chọn
Tóm lại : theo cách hiểu hiện tại của mình:
Để thao tác với CSDL trong ADO.Net có 4 cách
1- Dùng command để thực thi tham số truyền vào
ví dụ :
- Mã: Chọn tất cả
da.insertcommand=cmd
2- Dùng commandBuider để chấp nhận những thay đổi trong datatable
VD: Dim OleDbcommandbuider = new OleDbCommandbuilder(da)
3- Dùng câu lệnh thực thi ExenonQuery hoăc ExeReader
- Mã: Chọn tất cả
VD: cmd.ExeNonQuery
4- Dùng Store procedure
9. Tạo Báo Cáo (Crytal Report ):
Bạn có thể tham khảo 3 bài viết sau :
1. bài viết TẠO REPORT TRONG 1h của tungcan5diop http://caulacbovb.com/forum/viewtopic.php?f=8&t=5727&start=20
2. Tìm hiểu và thao tác với Crystal Report của anhtuyenbk http://caulacbovb.com/forum/viewtopic.php?f=23&t=562
3. Dynamic Crystal Report của thuytrang2542000 http://caulacbovb.com/forum/viewtopic.php?f=23&t=5357#p33693
===> Tóm lại để làm Report chỉ cần 2 bước cơ bản sau :
Bước 1: (Tạo thư mục baocao chứa 3 cái sau đây)
- Tạo Dataset --> ds_baocao
- Crytal Report theo cấu trúc của dataset (field của dataset tương ứng với field trong file nguồn) ----> rpt_baocao
- Form hiển thị báo cáo (chứa control CrytalReportView) --> frm_baocao
Bước 2 : Viết thủ tục inbaocao
Nạp dữ liệu cho Crytal Report theo datatable
myreport.SetDataSource(dt_nhanvien)
Nạp form trong report
f.CrystalReportViewer1.ReportSource = myreport
f.Show()
Bổ Sung : (Cập nhật ngày 11-08-2010)
1. Cập nhật những thay đổi trong lưới vào CSDL
cb = New OleDbCommandBuilder(da)
da.Update(dt)
dt.AcceptChanges()
End Sub
2. Lấy dữ liệu từ DataGridview thông qua các sự kiện (Event):
Form có 1 datagrid, trong datagrid có 3 cột là Id, Ten, Dt . Khi mình bấm vào 1 dòng nào đó trên datagrid thì các textbox sẽ hiển thị nội dung tương ứng của dòng đc click
Cách 1 :
Ở sự kiện RowHeaderMouseClick trong DataGridView:
textBox2.Text = dataGridView1.Rows[e.RowIndex].Cells[1].Value.ToString();
textBox3.Text = dataGridView1.Rows[e.RowIndex].Cells[2].Value.ToString();
Cách 2 :
Sự kiện CurrentCellChanged
i = DataGridView1.CurrentRow.Index() 'i = BindingContext.Item(dt).Position
txt_diachi1.Text = DataGridView1.Item("Diachi1",i).Value
hoặc :
Cách 3 : (nên dùng cách này)
Hoặc dùng sự kiện SelectionChanged
txt_diachi1.Text = DataGridView1.Item("Diachi1",i).Value
hoặc :
3. Bắt lỗi trong SQL:
bắt lỗi cú pháp cho dữ liệu nhé. Thường thì nó hay bị lỗi đấu nhấy đơn (" ' ") đó.
Return Chuoi.Replace(KiTuCu, KiTuMoi)
End Function
sử dụng :
Xem project demo về report : http://caulacbovb.com/forum/download/file.php?id=9840








Nó không chạy hay có báo lỗi gì không bạn?