04 chuong4-capnhatdulieu-140404115156-phpapp02

47
CẬP NHẬT DỮ LIỆU Chương 4

Upload: huynhtrong774129

Post on 14-Feb-2017

217 views

Category:

Education


0 download

TRANSCRIPT

Page 1: 04 chuong4-capnhatdulieu-140404115156-phpapp02

CẬP NHẬT DỮ LIỆUChương 4

Page 2: 04 chuong4-capnhatdulieu-140404115156-phpapp02

2

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”

Page 3: 04 chuong4-capnhatdulieu-140404115156-phpapp02

3

Câu lệnh SQL

Câu lệnh Insert

Câu lệnh Update

Câu lệnh Delete

Page 4: 04 chuong4-capnhatdulieu-140404115156-phpapp02

4

Câu lệnh SQLInsert

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ỉnhInsert into tênBang

Values(giatri1, giatri2, …, giatriN)

Insert into tênBang(cot1, cot2, …, cotN)Values(giatri1, giatri2, …, giatriN)

Page 5: 04 chuong4-capnhatdulieu-140404115156-phpapp02

5

Câu lệnh SQLInsert

Thê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ị NULL

Thêm dữ liệu được lấy từ 1 bảng khácInsert into tênBang1(cot1, cot2, …, CotN)

Select cot1, Cot2, …, CotNFrom tênBang2Where …

Page 6: 04 chuong4-capnhatdulieu-140404115156-phpapp02

6

Câu lệnh SQLInsert

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

Page 7: 04 chuong4-capnhatdulieu-140404115156-phpapp02

7

Câu lệnh SQLInsert

Copy từ 1 bảng sang 1 bảng khácSelect * into tênBangMoi

From tênBang1

Select cotK1, cotK2, … into tênBangMoiFrom 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”

Page 8: 04 chuong4-capnhatdulieu-140404115156-phpapp02

8

Câu lệnh SQLUpdate

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

Update tênBangSet cot1=newValue1, …, cotN=newValueNWhere 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ênBangSet cot1=null, …Where cotA = oldValueA …

Page 9: 04 chuong4-capnhatdulieu-140404115156-phpapp02

9

Câu lệnh SQLDelete

Câu lệnh Delete dùng để xóa 1 số dòng dữ liệu trong bảng

Delete From tênBangWhere 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ỏ

Page 10: 04 chuong4-capnhatdulieu-140404115156-phpapp02

10

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ố

Page 11: 04 chuong4-capnhatdulieu-140404115156-phpapp02

11

Dùng đối tượng CommandCá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

Page 12: 04 chuong4-capnhatdulieu-140404115156-phpapp02

12

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

Page 13: 04 chuong4-capnhatdulieu-140404115156-phpapp02

13

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

Page 14: 04 chuong4-capnhatdulieu-140404115156-phpapp02

14

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

Page 15: 04 chuong4-capnhatdulieu-140404115156-phpapp02

15

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

Page 16: 04 chuong4-capnhatdulieu-140404115156-phpapp02

16

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

Page 17: 04 chuong4-capnhatdulieu-140404115156-phpapp02

17

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

Page 18: 04 chuong4-capnhatdulieu-140404115156-phpapp02

18

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

Page 19: 04 chuong4-capnhatdulieu-140404115156-phpapp02

19

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

Page 20: 04 chuong4-capnhatdulieu-140404115156-phpapp02

20

Chỉnh sửa dữ liệu DisconnectedTrạ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

Page 21: 04 chuong4-capnhatdulieu-140404115156-phpapp02

21

Chỉnh sửa dữ liệu DisconnectedThê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:object[] rowValues = {giatri1,giatri2,…};tenBang.LoadDataRow(rowValues, false);

Page 22: 04 chuong4-capnhatdulieu-140404115156-phpapp02

22

Chỉnh sửa dữ liệu DisconnectedChỉ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();

Page 23: 04 chuong4-capnhatdulieu-140404115156-phpapp02

23

Chỉnh sửa dữ liệu DisconnectedChỉnh sửa các dòng dữ liệu

Cách 3:

DataRow row;int index;…row = tenBang.Rows[index];row.ItemArray = new object[]{giatri1, giatri2, … };

Page 24: 04 chuong4-capnhatdulieu-140404115156-phpapp02

24

Chỉnh sửa dữ liệu DisconnectedXó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);

Page 25: 04 chuong4-capnhatdulieu-140404115156-phpapp02

25

Chỉnh sửa dữ liệu DisconnectedXóa các dòng dữ liệu

Cách 3:DataRow row;int index;…tenBang.RemoveAt(index);

Page 26: 04 chuong4-capnhatdulieu-140404115156-phpapp02

26

Chỉnh sửa dữ liệu DisconnectedPhiê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

DataRow row;int index;…row = tenBang.Rows[index];row["cot1"] = giatrimoi1;row["cot2"] = giatrimoi2;…string strOldData;strOldData = row["tenCot", DataRowVersion.Original];

Page 27: 04 chuong4-capnhatdulieu-140404115156-phpapp02

27

Chỉnh sửa dữ liệu DisconnectedPhiê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

Page 28: 04 chuong4-capnhatdulieu-140404115156-phpapp02

28

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

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

Page 29: 04 chuong4-capnhatdulieu-140404115156-phpapp02

29

Dù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òn tiếp}

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

Page 30: 04 chuong4-capnhatdulieu-140404115156-phpapp02

30

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

}

Page 31: 04 chuong4-capnhatdulieu-140404115156-phpapp02

31

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

int 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

Page 32: 04 chuong4-capnhatdulieu-140404115156-phpapp02

32

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

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

}

Xóa 1 DataRow trong CSDL

Page 33: 04 chuong4-capnhatdulieu-140404115156-phpapp02

33

Dù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];…     return cmdUpdate.ExecuteNonQuery();

}

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

Page 34: 04 chuong4-capnhatdulieu-140404115156-phpapp02

34

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

Page 35: 04 chuong4-capnhatdulieu-140404115156-phpapp02

35

Dùng đối tượng DataAdapter

Data sourceDataAdapterDataTable

DataTable

DataSet

DataAdapter

Fill

UpdateFill

Update

Page 36: 04 chuong4-capnhatdulieu-140404115156-phpapp02

36

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

Page 37: 04 chuong4-capnhatdulieu-140404115156-phpapp02

37

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)

Page 38: 04 chuong4-capnhatdulieu-140404115156-phpapp02

38

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

Page 39: 04 chuong4-capnhatdulieu-140404115156-phpapp02

39

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

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

Page 40: 04 chuong4-capnhatdulieu-140404115156-phpapp02

40

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

Page 41: 04 chuong4-capnhatdulieu-140404115156-phpapp02

41

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

Page 42: 04 chuong4-capnhatdulieu-140404115156-phpapp02

42

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

Page 43: 04 chuong4-capnhatdulieu-140404115156-phpapp02

43

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

Page 44: 04 chuong4-capnhatdulieu-140404115156-phpapp02

44

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

Page 45: 04 chuong4-capnhatdulieu-140404115156-phpapp02

45

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

Page 46: 04 chuong4-capnhatdulieu-140404115156-phpapp02

46

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

Page 47: 04 chuong4-capnhatdulieu-140404115156-phpapp02

47

Tóm tắt chương 4