Nội dung Câu lệnh SQL Dùng đối tượng Command Chỉnh sửa dữ liệu Disconnected Dùng đối tượng Command với DataTable/DataSet Dùng đối tượng DataAdapter Dùng đối tượng CommandBuil
Trang 1CẬP NHẬT DỮ LIỆU
Chương 4
Trang 2Nội dung
Câu lệnh SQL
Dùng đối tượng Command
Chỉnh sửa dữ liệu Disconnected
Dùng đối tượng Command với DataTable/DataSet
Dùng đối tượng DataAdapter
Dùng đối tượng CommandBuilder
Cấu hình DataAdapter “bằng tay”
Trang 3Câu lệnh SQL
Câu lệnh Insert
Câu lệnh Update
Câu lệnh Delete
Trang 4• Thêm 1 số phần dữ liệu của 1 dòng
• Thêm dữ liệu được lấy từ 1 bảng khác
Thêm 1 dòng hoàn chỉnh
Insert into tênBang
Values (giatri1, giatri2, …, giatriN)
Insert into tênBang(cot1, cot2, …, cotN)
Values (giatri1, giatri2, …, giatriN)
Trang 5Câu lệnh SQL
Insert
Thêm 1 số phần dữ liệu của 1 dòng
Insert into tênBang(cotK1, cotK2, …)
Values (giatriK1, giatriK2, …)
• Cột không liệt kê ra sẽ nhận giá trị NULL
Thêm dữ liệu được lấy từ 1 bảng khác
Insert into tênBang1(cot1, cot2, …, CotN)
Select cot1, Cot2, …, CotN
Trang 6Câu lệnh SQL
Insert
Chú ý:
• Từ khoá Into trong câu lệnh Insert có thể bỏ,
nhưng không nên bỏ
• Nên liệt kê các cột dữ liệu khi dùng câu lệnh
insert dữ liệu
Trang 7Select cotK1, cotK2, … into tênBangMoi
From tênBang1, tênBang2, …
Where …
Group By …
Hoạt động:
Trang 8Set cot1=newValue1, …, cotN=newValueN
Where cot1 = oldValue1 and … and cotN=oldValueN
Để xóa giá trị của 1 ô dữ liệu trong bảng,
chúng ta thiết lập giá trị đó bằng null
Update tênBang
Set cot1=null, …
Where cotA = oldValueA …
Trang 9Câu lệnh SQL
Delete
Câu lệnh Delete dùng để xóa 1 số dòng dữ
liệu trong bảng
Delete From tênBang
Where cot1=giatri1 and cot2=giatri2 and … and
cotN=giatriN
Chú ý:
• Delete dùng để xóa cả 1 dòng, chứ không xóa 1 cột của dòng
• Delete không xóa bảng, chỉ xóa dữ liệu
• Để xóa mọi dòng dữ liệu trong bảng nên dùng
Trang 10Dùng đối tượng Command
Các bước thực hiện
Đối tượng Command không có tham số
Đối tượng Command có tham số
Trang 11Dùng đối tượng Command
Các bước thực hiện
3 bước sử dụng đối tượng command để cập
nhật dữ liệu
• Bước 1: Tạo câu SQL
• Bước 2: Tạo đối tượng Command chứa câu SQL
• Bước 3: Gọi phương thức ExecuteNonQuery() của đối tượng Command
Trang 12Dùng đối tượng Command
Đối tượng Command không có tham số
string strSQL =
"INSERT INTO tênBang(cot1, …) " +
" VALUES (giatri1, …)";
SqlCommand cmd = new SqlCommand (strSQL, conn);
int numberOfRows = cmd.ExecuteNonQuery();
Câu lệnh Insert
Trang 13Dùng đối tượng Command
Đối tượng Command không có tham số
string strSQL =
"UPDATE tênBang" +
" SET cot1 = newValue1,…, cotN=giatriN" +
" WHERE cot1=oldValue1 and … and cotN=oldValueN";
SqlCommand cmd = new SqlCommand (strSQL, conn);
int numberOfRows = cmd.ExecuteNonQuery();
Câu lệnh Update
Trang 14Dùng đối tượng Command
Đối tượng Command không có tham số
string strSQL =
"DELETE FROM tênBang" +
" WHERE cot1=giatri1 and … and cotN=giatriN";
SqlCommand cmd = new SqlCommand (strSQL, conn);
int numberOfRows = cmd.ExecuteNonQuery();
Câu lệnh Delete
Trang 15Dùng đối tượng Command
Đối tượng Command có tham số
Phương thức tạo câu lệnh Insert
Trang 16Dùng đối tượng Command
Đối tượng Command có tham số
Phương thức tạo câu lệnh Update
" where cot1=@OrigCot1 and … and cotN=@OrigCotN"; SqlCommand cmd = new SqlCommand (strSQL, conn);
Trang 17Dùng đối tượng Command
Đối tượng Command có tham số
Phương thức tạo câu lệnh Delete
SqlParameterCollection pc = cmd.Parameters;
pc.Add("@cot1", SqlDbType.Kieu);
…
Trang 18Dùng đối tượng Command
Đối tượng Command có tham số
Sử dụng các đối tượng command có tham số
Trang 19Chỉnh sửa dữ liệu Disconnected
Trạng thái của DataRow
Thêm các dòng dữ liệu mới
Chỉnh sửa các dòng dữ liệu
Xóa các dòng dữ liệu
Phiên bản dữ liệu trong DataRow
Trang 20Chỉnh sửa dữ liệu Disconnected
Trạng thái của DataRow
Khi chúng ta thao tác trên đối tượng DataRow,
DataRow sẽ tự động ghi nhận lại thao tác đó vào
property trạng thái tenRow.RowState.
RowState thuộc kiểu DataRowState
Trang 21Chỉnh sửa dữ liệu Disconnected
Thêm các dòng dữ liệu mới
Cách 2:
object [] rowValues = {giatri1,giatri2,…};
tenBang.LoadDataRow(rowValues, false );
Trang 22row["cot1"] = giatrimoi1;
row["cot2"] = giatrimoi2;
… row.EndEdit();
Trang 23Chỉnh sửa dữ liệu Disconnected
Trang 24 Cách 2: DataRow row;
int index;
… row = tenBang.Rows[index];
tenBang.Remove(row);
Trang 25Chỉnh sửa dữ liệu Disconnected
Trang 26Chỉnh sửa dữ liệu Disconnected
Phiên bản dữ liệu trong DataRow
Truy cập các phiên bản dữ liệu khác nhau
Trang 27Chỉnh sửa dữ liệu Disconnected
Phiên bản dữ liệu trong DataRow
Các giá trị trong enum DataRowVersion
• Current - Lấy giá trị hiện tai
• Original - Lấy giá trị gốc
• Proposed - Lấy giá trị sau BeginEdit và
trước EndEdit
• Default - Lấy giá trị như khi tham số này
chỉ ra
Trang 28Dùng đối tượng Command với DataTable/DataSet
Các bước thực hiện
• Bước 1 : Tạo 3 đối tượng Command: insert, update, delete
• Bước 2: Xác định các dòng bị thay đổi trong DataTable
• Bước 3: Xác định loại thay đổi của mỗi dòng này (là insert, update hay delete)
• Bước 4: Dùng các giá trị trong dòng để gán cho các tham
số trong đối tượng command
• Bước 5: Gọi ExecuteNonQuery() để thực thi câu truy vấn
được lưu trong đối tượng command
• Bước 6: Dùng kiểu trả về của ExecuteNonQuery() để xác định lệnh cập nhật có thành công không
– Nếu cập nhật thành công thì chúng ta gọi AcceptChanges()
– Nếu cập nhật không thành công thì chúng ta thiết lập lỗi cho thuộc tính RowError của đối tượng DataRow
Trang 29Dùng đối tượng Command với DataTable/DataSet
void SubmitChanges()
{
SqlCommand cmdInsert = CreateInsertCommand();
SqlCommand cmdUpdate = CreateUpdateCommand();
SqlCommand cmdDelete = CreateDeleteCommand();
DataViewRowState states =
DataViewRowState.Added | DataViewRowState.Deleted | DataViewRowState.ModifiedCurrent;
Cập nhật mọi dữ liệu trong DataTable vào CSDL
Trang 30case DateRowState Modified:
num = SubmitUpdate(row, cmdUpdate);
break ; case DateRowState Added:
num = SubmitInsert(row, cmdInsert);
break ; case DateRowState Deleted:
num = SubmitDelete(row, cmdDelete);
break ; }
Trang 31Dùng đối tượng Command với DataTable/DataSet
int SubmitInsert( DataRow row, SqlCommand cmdInsert)
{
SqlParameterCollection pc = cmdInsert.Parameters; pc["@Cot1"].Value = row["Cot1"];
Trang 32Dùng đối tượng Command với DataTable/DataSet
int SubmitDelete( DataRow row, SqlCommand cmdDelete)
{
SqlParameterCollection pc = cmdDelete.Parameters; pc["@Cot1"].Value =
Trang 33Dùng đối tượng Command với DataTable/DataSet
int SubmitUpdate( DataRow row, SqlCommand cmdUpdate)
{
SqlParameterCollection pc = cmdUpdate.Parameters; pc["@Cot1"].Value = row["Cot1"];
pc["@Cot2"].Value = row["Cot2"];
… pc["@OrginCot1"].Value = row["Cot1", DataRowVersion.Original];
pc["@OriginCot2"].Value =
row["Cot2", DataRowVersion.Original];
Cập nhật 1 DataRow vào CSDL
Trang 34Dùng đối tượng DataAdapter
Đối tượng DataAdapter có 2 nhiệm vụ
• Lấy dữ liệu từ data source và lưu trữ dữ liệu
đó vào trong các đối tượng Disconnected (DataSet, DataTable)
• Cập nhật dữ liệu từ các đối tượng
Disconnected vào data source
Trang 35Dùng đối tượng DataAdapter
Data source DataAdapter
Trang 36Dùng đối tượng DataAdapter
Để cập nhật dữ liệu, DataAdapter cũng dùng các câu lệnh SQL Insert/Update/Delete được lưu trong
3 đối tượng Command của DataAdapter
• InsertCommand
• UpdateCommand
• DeleteCommand
Trang 37Dùng đối tượng DataAdapter
Chúng ta có 3 lựa chọn để tạo các đối tượng Command trong DataAdapter
• Dùng đối tượng SqlCommandBuilder để sinh
3 đối tượng Command lúc thực thi (run time)
• Cấu hình 3 đối tượng Command “bằng tay”
• Dùng Data Adapter Configuration Wizard lúc
Trang 38Dùng đối tượng CommandBuilder
SqlCommandBuilder sẽ sinh các câu lệnh
Insert/Update/Delete dựa trên câu lệnh select chúng
ta cung cấp
SqlCommandBuilder chỉ sinh được câu lệnh
Insert/Update/Delete khi các điều kiện sau thỏa mãn
• Câu lệnh Select chỉ truy vấn trên 1 bảng
• Câu lệnh Select có chứa khóa chính
Trang 39Dùng đối tượng CommandBuilder
Xây dựng 3 đối tượng Command và cập nhật
SqlDataAdapter da = new SqlDataAdapter (cmd);
SqlCommandBuilder cb = new SqlCommandBuilder(da);
…
Trang 40Cấu hình DataAdapter “bằng tay”
Khái niệm
Tạo Command cho câu lệnh Insert
Tạo Command cho câu lệnh Update
Tạo Command cho câu lệnh Delete
Cập nhật dữ liệu
Trang 41Cấu hình DataAdapter “bằng tay”
Khái niệm
Để vượt qua giới hạn của SqlCommandBuilder , chúng ta có thể tự xây dựng các đối tượng
command cho data adapter
Chú ý: Khi chúng ta thêm các parameter cho các đối tượng command của DataAdapter, chúng ta
sẽ dùng 2 thuộc tính của đối tượng Parameter được thiết kế cho việc cập nhật dữ liệu:
Trang 43Cấu hình DataAdapter “bằng tay”
Tạo Command cho câu lệnh Insert
private SqlCommand CreateInsertCommand()
Trang 44Cấu hình DataAdapter “bằng tay”
Tạo Command cho câu lệnh Update
private SqlCommand CreateUpdateCommand()
{
string strSQL =
“update tenBang" + " set cot1=@p1, cot2=@p2,…“+
“ where cot1=@q1 and cot2=q2 …”;
SqlCommand cmd = new SqlCommand (strSQL, conn);
Trang 45Cấu hình DataAdapter “bằng tay”
Tạo Command cho câu lệnh Delete
private SqlCommand CreateDeleteCommand()
Trang 47Tóm tắt chương 4