Bài giảng Lập trình cơ sở dữ liệu - Chương 4: Cập nhật dữ liệu

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”

ppt47 trang | Chia sẻ: thuongdt324 | Lượt xem: 581 | Lượt tải: 0download
Bạn đang xem trước 20 trang tài liệu Bài giảng Lập trình cơ sở dữ liệu - Chương 4: Cập nhật dữ liệu, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
CẬP NHẬT DỮ LIỆUChương 4Nội dungCâu lệnh SQLDùng đối tượng CommandChỉnh sửa dữ liệu DisconnectedDùng đối tượng Command với DataTable/DataSetDùng đối tượng DataAdapterDùng đối tượng CommandBuilderCấu hình DataAdapter “bằng tay”Câu lệnh SQLCâu lệnh InsertCâu lệnh UpdateCâu lệnh DeleteCâu lệnh SQL InsertCâu lệnh Insert dùng để thêm 1 dòng dữ liệu vào bảngThêm 1 dòng hoàn chỉnhThêm 1 số phần dữ liệu của 1 dòngThêm dữ liệu được lấy từ 1 bảng khácThêm 1 dòng hoàn chỉnhInsert into tênBang Values(giatri1, giatri2, , giatriN)Insert into tênBang(cot1, cot2, , cotN) Values(giatri1, giatri2, , giatriN)Câu lệnh SQL InsertThêm 1 số phần dữ liệu của 1 dòngInsert into tênBang(cotK1, cotK2, ) Values(giatriK1, giatriK2, )Cột không liệt kê ra sẽ nhận giá trị NULLThêm dữ liệu được lấy từ 1 bảng khácInsert into tênBang1(cot1, cot2, , CotN) Select cot1, Cot2, , CotN From tênBang2 Where Câu lệnh SQL InsertChú ý: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 Câu lệnh SQL InsertCopy từ 1 bảng sang 1 bảng khácSelect * into tênBangMoi From tênBang1Select cotK1, cotK2, into tênBangMoi From tênBang1, tênBang2, Where Group By Hoạt động:Tạo bảng “tênBangMoi”Chép dữ liệu vào “tênBangMoi”Câu lệnh SQL UpdateCâu lệnh Update dùng để cập nhật (chỉnh sửa) dữ liệuUpdate tênBang Set 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 nullUpdate tênBang Set cot1=null, Where cotA = oldValueA Câu lệnh SQL DeleteCâu lệnh Delete dùng để xóa 1 số dòng dữ liệu trong bảngDelete From tênBang Where cot1=giatri1 and cot2=giatri2 and and cotN=giatriNChú ý: Delete dùng để xóa cả 1 dòng, chứ không xóa 1 cột của dòngDelete 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 lệnh Truncate TableTừ khóa From trong câu lệnh delete có thể bỏ, nhưng không nên bỏDùng đối tượng CommandCác bước thực hiệnĐối tượng Command không có tham sốĐối tượng Command có tham sốDùng đối tượng Command Các bước thực hiện3 bước sử dụng đối tượng command để cập nhật dữ liệuBước 1: Tạo câu SQLBước 2: Tạo đối tượng Command chứa câu SQLBước 3: Gọi phương thức ExecuteNonQuery() của đối tượng CommandDù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 InsertDù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 UpdateDù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 DeleteDùng đối tượng Command Đối tượng Command có tham sốPhương thức tạo câu lệnh InsertSqlCommand CreateInsertCommand() { string strSQL; strSQL = "Insert tênBang(cot1, ) " + " values(@cot1, )"; SqlCommand cmd = new SqlCommand(strSQL, conn); SqlParameterCollection pc = cmd.Parameters; pc.Add("@cot1", SqlDbType.Kieu); return cmd; }Dùng đối tượng Command Đối tượng Command có tham sốPhương thức tạo câu lệnh UpdateSqlCommand CreateUpdateCommand() { string strSQL; strSQL = "Update tênBang " + " set cot1=@cot1, , cotN=@cotN " + " where cot1=@OrigCot1 and and cotN=@OrigCotN"; SqlCommand cmd = new SqlCommand(strSQL, conn); SqlParameterCollection pc = cmd.Parameters; pc.Add("@cot1", SqlDbType.Kieu); pc.Add(@OrigCot1, SqlDbType.Kieu) return cmd; }Dùng đối tượng Command Đối tượng Command có tham sốPhương thức tạo câu lệnh DeleteSqlCommand CreateDeleteCommand() { string strSQL; strSQL = "Delete from tênBang " + " where @cot1=giatri1 and and @cotN=giatriN"; SqlCommand cmd = new SqlCommand(strSQL, conn); SqlParameterCollection pc = cmd.Parameters; pc.Add("@cot1", SqlDbType.Kieu); return cmd; }Dùng đối tượng Command Đối tượng Command có tham sốSử dụng các đối tượng command có tham sốint SubmitInsert/Update/Delete() { SqlCommand cmd = CreateInsertCommand(); //SqlCommand cmd = CreateUpdateCommand(); //SqlCommand cmd = CreateDeleteCommand(); cmd.Parameters[@tenThamSo] = giatri; return cmd.ExecuteNonQuery(); }Chỉnh sửa dữ liệu DisconnectedTrạng thái của DataRowThêm các dòng dữ liệu mớiChỉ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 DataRowChỉnh sửa dữ liệu Disconnected Trạng thái của DataRowKhi 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 DataRowStateDataRowState.AddedDataRowState.DeletedDataRowState.DetachedDataRowState.ModifiedDataRowState.UnchangedChỉnh sửa dữ liệu Disconnected Thêm các dòng dữ liệu mớiCách 1:DataRow row; row = tenBang.NewRow(); row["cot1"] = giatri1; row["cot2"] = giatri2; tenBang.Rows.Add(row);Cách 2:object[] rowValues = {giatri1,giatri2,}; tenBang.LoadDataRow(rowValues, false);Chỉnh sửa dữ liệu Disconnected Chỉnh sửa các dòng dữ liệu Cách 1:DataRow row; int index; row = tenBang.Rows[index]; row["cot1"] = giatrimoi1; row["cot2"] = giatrimoi2; Cách 2:DataRow row; int index; row = tenBang.Rows[index]; row.BeginEdit(); row["cot1"] = giatrimoi1; row["cot2"] = giatrimoi2; row.EndEdit();Chỉnh sửa dữ liệu Disconnected Chỉnh sửa các dòng dữ liệuCách 3:DataRow row; int index; row = tenBang.Rows[index]; row.ItemArray = new object[]{giatri1, giatri2, };Chỉnh sửa dữ liệu Disconnected Xóa các dòng dữ liệu Cách 1:DataRow row; int index; row = tenBang.Rows[index]; row.Delete();Cách 2:DataRow row; int index; row = tenBang.Rows[index]; tenBang.Remove(row);Chỉnh sửa dữ liệu Disconnected Xóa các dòng dữ liệu Cách 3:DataRow row; int index; tenBang.RemoveAt(index);Chỉnh sửa dữ liệu Disconnected Phiên bản dữ liệu trong DataRowTruy cập các phiên bản dữ liệu khác nhau của DataRowDataRow row; int index; row = tenBang.Rows[index]; row["cot1"] = giatrimoi1; row["cot2"] = giatrimoi2; string strOldData; strOldData = row["tenCot", DataRowVersion.Original];Chỉnh sửa dữ liệu Disconnected Phiên bản dữ liệu trong DataRowCác giá trị trong enum DataRowVersionCurrent - Lấy giá trị hiện taiOriginal - Lấy giá trị gốcProposed - Lấy giá trị sau BeginEdit và trước EndEditDefault - Lấy giá trị như khi tham số này chỉ raDùng đối tượng Command với DataTable/DataSetCác bước thực hiệnBước 1: Tạo 3 đối tượng Command: insert, update, deleteBước 2: Xác định các dòng bị thay đổi trong DataTableBướ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 commandBướ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 DataRowDùng đối tượng Command với DataTable/DataSetvoid SubmitChanges() { SqlCommand cmdInsert = CreateInsertCommand(); SqlCommand cmdUpdate = CreateUpdateCommand(); SqlCommand cmdDelete = CreateDeleteCommand(); DataViewRowState states = DataViewRowState.Added | DataViewRowState.Deleted | DataViewRowState.ModifiedCurrent; // Còn tiếp }Cập nhật mọi dữ liệu trong DataTable vào CSDLDùng đối tượng Command với DataTable/DataSetvoid SubmitChanges() { int num = 0; foreach (DataRow row in tenBang.Select("","",states)) { switch (row.RowState) { case DateRowState.Modified: num = SubmitUpdate(row, cmdUpdate); break; case DateRowState.Added: num = SubmitInsert(row, cmdInsert); break; case DateRowState.Deleted: num = SubmitDelete(row, cmdDelete); break; } if (num == 1) row.AcceptChange(); else row.Error = “Lỗi cập nhật"; } }Dùng đối tượng Command với DataTable/DataSetint SubmitInsert(DataRow row, SqlCommand cmdInsert) {      SqlParameterCollection pc = cmdInsert.Parameters; pc["@Cot1"].Value = row["Cot1"]; pc["@Cot2"].Value = row["Cot2"]; return cmdInsert.ExecuteNonQuery(); } Thêm 1 DataRow vào CSDL Dùng đối tượng Command với DataTable/DataSetint SubmitDelete(DataRow row, SqlCommand cmdDelete) {      SqlParameterCollection pc = cmdDelete.Parameters; pc["@Cot1"].Value =  row["Cot1", DataRowVersion.Original]; pc["@Cot2"].Value =  row["Cot2", DataRowVersion.Original];      return cmdDelete.ExecuteNonQuery(); } Xóa 1 DataRow trong CSDL Dùng đối tượng Command với DataTable/DataSetint 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];      return cmdUpdate.ExecuteNonQuery(); } Cập nhật 1 DataRow vào CSDL Dù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 sourceDùng đối tượng DataAdapterData sourceDataAdapterDataTableDataTableDataSetDataAdapterFillUpdateFillUpdateDù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 DataAdapterInsertCommandUpdateCommandDeleteCommand Dùng đối tượng DataAdapterChúng ta có 3 lựa chọn để tạo các đối tượng Command trong DataAdapterDù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 thiết kế (design time)Dùng đối tượng CommandBuilderSqlCommandBuilder 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ấpSqlCommandBuilder chỉ sinh được câu lệnh Insert/Update/Delete khi các điều kiện sau thỏa mãnCâu lệnh Select chỉ truy vấn trên 1 bảngCâu lệnh Select có chứa khóa chínhDùng đối tượng CommandBuilderXây dựng 3 đối tượng Command và cập nhật dữ liệu string strSQL = "Select cot1, cot2," + " From tenBang "; SqlDataAdapter da = new SqlDataAdapter(cmd); SqlCommandBuilder cb = new SqlCommandBuilder(da); da.Update(tenBang);Cấu hình DataAdapter “bằng tay”Khái niệmTạo Command cho câu lệnh InsertTạo Command cho câu lệnh UpdateTạo Command cho câu lệnh DeleteCập nhật dữ liệuCấ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: param.SourceColumn, param.SourceVersion Cấu hình DataAdapter “bằng tay” Khái niệmparam.SourceColumn = “tênCột”Chỉ ra kết nối giữa 1 paramter (param) với 1 cột (tênCột) trong DataTableparam.SourceVersion = DataRowVersion.Current (default)DataRowVersion.OriginalCho biết Phiên bản dữ liệu trong DataRow nào được sử dụng cho 1 parameterCấu hình DataAdapter “bằng tay” Tạo Command cho câu lệnh Insertprivate SqlCommand CreateInsertCommand() { string strSQL = "insert into tenBang(cot1, cot2, )" + " values(@p1,@p2,)"; SqlCommand cmd = new SqlCommand(strSQL, conn); SqlParameterCollection pc = cmd.Parameters; SqlParameter paramP1 = new SqlParameter("@p1", SqlDbType.Kieu,); paramP1.SourceColumn = “cot1”; pc.Add(paramP1); return cmd; }Cấu hình DataAdapter “bằng tay” Tạo Command cho câu lệnh Updateprivate SqlCommand CreateUpdateCommand() { string strSQL = “update tenBang" + " set cot1=@p1, cot2=@p2,“+ “ where cot1=@q1 and cot2=q2 ”; SqlCommand cmd = new SqlCommand(strSQL, conn); SqlParameterCollection pc = cmd.Parameters; SqlParameter paramP1 = new SqlParameter("@p1", SqlDbType.Kieu,); paramP1.SourceColumn = “cot1”; SqlParameter paramQ1 = new SqlParameter("@q1", SqlDbType.Kieu,); paramQ1.SourceColumn = “cot1”; paramQ1.SourceVersion = DataRowVersion.Original; pc.Add(paramP1); pc.Add(paramQ1); return cmd; }Cấu hình DataAdapter “bằng tay” Tạo Command cho câu lệnh Deleteprivate SqlCommand CreateDeleteCommand() { string strSQL = “delete from tenBang" + " where cot1=@q1 and cot2=q2 ”; SqlCommand cmd = new SqlCommand(strSQL, conn); SqlParameterCollection pc = cmd.Parameters; SqlParameter paramQ1 = new SqlParameter("@q1", SqlDbType.Kieu,); paramQ1.SourceColumn = “cot1”; paramQ1.SourceVersion = DataRowVersion.Original; pc.Add(paramQ1); return cmd; }Cấu hình DataAdapter “bằng tay” Cập nhật dữ liệuvoid SubmitChanges() { da.InsertCommand = CreateInsertCommand(); da.UpdateCommand = CreateUpdateCommand(); da.DeleteCommand = CreateDeleteCommand(); da.Update(dt); }Tóm tắt chương 4