Chương 4

CẬP NHẬT DỮ LIỆU

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 CommandBuilder  Cấu hình DataAdapter “bằng tay”

2

Câu lệnh SQL

 Câu lệnh Insert

 Câu lệnh Update

 Câu lệnh Delete

3

Câu lệnh SQL Insert

 Câu lệnh Insert dùng để thêm 1 dòng dữ liệu

vào bảng • Thêm 1 dòng hoàn chỉnh • 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)

4

Values(giatri1, giatri2, …, giatriN)

Câ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, …)

• Cột không liệt kê ra sẽ nhận giá trị NULL

Values(giatriK1, giatriK2, …)

 Thêm dữ liệu được lấy từ 1 bảng khác

Insert into tênBang1(cot1, cot2, …, CotN)

5

Select cot1, Cot2, …, CotN From tênBang2 Where …

Câ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

6

Câu lệnh SQL Insert

 Copy từ 1 bảng sang 1 bảng khác Select * into tênBangMoi From tênBang1

Select 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”

7

Câu lệnh SQL Update

 Câu lệnh Update dùng để cập nhật (chỉnh sửa)

dữ liệu

Update 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 null

Update tênBang

8

Set cot1=null, … Where cotA = oldValueA …

Câ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

lệnh Truncate Table

• Từ khóa From trong câu lệnh delete có thể bỏ,

nhưng không nên bỏ

9

Dù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ố

10

Dù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

11

Dùng đối tượng Command Đối tượng Command không có tham số

 Câu lệnh Insert

string strSQL =

"INSERT INTO tênBang(cot1, …) " + " VALUES (giatri1, …)";

12

SqlCommand cmd = new SqlCommand(strSQL, conn); int numberOfRows = cmd.ExecuteNonQuery();

Dùng đối tượng Command Đối tượng Command không có tham số

 Câu lệnh Update

string strSQL =

"UPDATE tênBang" + " SET cot1 = newValue1,…, cotN=giatriN" + " WHERE cot1=oldValue1 and … and cotN=oldValueN";

13

SqlCommand cmd = new SqlCommand(strSQL, conn); int numberOfRows = cmd.ExecuteNonQuery();

Dùng đối tượng Command Đối tượng Command không có tham số

 Câu lệnh Delete

string strSQL =

"DELETE FROM tênBang" + " WHERE cot1=giatri1 and … and cotN=giatriN";

14

SqlCommand cmd = new SqlCommand(strSQL, conn); int numberOfRows = cmd.ExecuteNonQuery();

Dùng đối tượng Command Đối tượng Command có tham số

 Phương thức tạo câu lệnh Insert

SqlCommand 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;

15

}

Dùng đối tượng Command Đối tượng Command có tham số  Phương thức tạo câu lệnh Update

SqlCommand 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;

}

16

Dùng đối tượng Command Đối tượng Command có tham số

 Phương thức tạo câu lệnh Delete

SqlCommand 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;

}

17

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();

18

}

Chỉ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

19

Chỉ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

• DataRowState.Added • DataRowState.Deleted • DataRowState.Detached • DataRowState.Modified • DataRowState.Unchanged

20

Chỉnh sửa dữ liệu Disconnected Thêm các dòng dữ liệu mới

 Cách 1:

DataRow row; row = tenBang.NewRow(); row["cot1"] = giatri1; row["cot2"] = giatri2; … tenBang.Rows.Add(row);

 Cách 2:

21

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:

22

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ệu

 Cách 3:

23

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:

24

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:

25

DataRow row; int index; … tenBang.RemoveAt(index);

Chỉ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

của DataRow

26

DataRow 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 DataRow

 Các giá trị trong enum DataRowVersion

• Current • Original • Proposed

• Default

- Lấy giá trị hiện tai - Lấy giá trị gốc - Lấy giá trị sau BeginEdit và trước EndEdit - Lấy giá trị như khi tham số này chỉ ra

27

Dù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

28

thuộc tính RowError của đối tượng DataRow

Dùng đối tượng Command với DataTable/DataSet

 Cập nhật mọi dữ liệu trong DataTable vào CSDL

void SubmitChanges() {

SqlCommand cmdInsert = CreateInsertCommand(); SqlCommand cmdUpdate = CreateUpdateCommand(); SqlCommand cmdDelete = CreateDeleteCommand();

DataViewRowState states =

DataViewRowState.Added | DataViewRowState.Deleted | DataViewRowState.ModifiedCurrent;

// Còn tiếp

29

}

Dùng đối tượng Command với DataTable/DataSet

void 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";

}

}

30

Dùng đối tượng Command với DataTable/DataSet

 Thêm 1 DataRow vào CSDL

int SubmitInsert(DataRow row, SqlCommand cmdInsert) {

SqlParameterCollection pc = cmdInsert.Parameters; pc["@Cot1"].Value = row["Cot1"]; pc["@Cot2"].Value = row["Cot2"]; … return cmdInsert.ExecuteNonQuery();

31

}

Dùng đối tượng Command với DataTable/DataSet

 Xóa 1 DataRow trong CSDL

int 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();

32

}

Dùng đối tượng Command với DataTable/DataSet

 Cập nhật 1 DataRow vào CSDL

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];

… return cmdUpdate.ExecuteNonQuery();

33

}

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 source

34

Dùng đối tượng DataAdapter

DataSet

Data source

DataAdapter

DataTable

FillFill

Update Update

DataAdapter

DataTable

FillFill

Update Update

35

Dù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

36

Dù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

thiết kế (design time)

37

Dù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

38

Dùng đối tượng CommandBuilder

 Xâ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);

39

SqlCommandBuilder cb = new SqlCommandBuilder(da); … … da.Update(tenBang);

Cấ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

40

Cấ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

41

Cấu hình DataAdapter “bằng tay” Khái niệm

 param.SourceColumn = “tênCột”

• Chỉ ra kết nối giữa 1 paramter (param) với 1 cột

(tênCột) trong DataTable

 param.SourceVersion =

• DataRowVersion.Current (default) • DataRowVersion.Original • Cho biết Phiên bản dữ liệu trong DataRow nào

được sử dụng cho 1 parameter

42

Cấu hình DataAdapter “bằng tay” Tạo Command cho câu lệnh Insert

private 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; }

43

Cấ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); 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; }

44

Cấu hình DataAdapter “bằng tay” Tạo Command cho câu lệnh Delete

private 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; }

45

Cấu hình DataAdapter “bằng tay” Cập nhật dữ liệu

void SubmitChanges() {

da.InsertCommand = CreateInsertCommand(); da.UpdateCommand = CreateUpdateCommand(); da.DeleteCommand = CreateDeleteCommand();

da.Update(dt);

46

}

Tóm tắt chương 4

47