04 chuong 4 - cap nhat du lieu

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

Upload: trong-le

Post on 27-Jun-2015

167 views

Category:

Education


0 download

DESCRIPTION

chương 4 ado.net

TRANSCRIPT

Page 1: 04   chuong 4 - cap nhat du lieu

CẬP NHẬT DỮ LIỆU

Chương 4

Page 2: 04   chuong 4 - cap nhat du lieu

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   chuong 4 - cap nhat du lieu

3

Câu lệnh SQL

Câu lệnh Insert

Câu lệnh Update

Câu lệnh Delete

Page 4: 04   chuong 4 - cap nhat du lieu

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

Insert into tênBangValues(giatri1, giatri2, …, giatriN)

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

Page 5: 04   chuong 4 - cap nhat du lieu

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   chuong 4 - cap nhat du lieu

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   chuong 4 - cap nhat du lieu

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   chuong 4 - cap nhat du lieu

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   chuong 4 - cap nhat du lieu

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   chuong 4 - cap nhat du lieu

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   chuong 4 - cap nhat du lieu

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   chuong 4 - cap nhat du lieu

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   chuong 4 - cap nhat du lieu

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   chuong 4 - cap nhat du lieu

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   chuong 4 - cap nhat du lieu

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   chuong 4 - cap nhat du lieu

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   chuong 4 - cap nhat du lieu

17

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

Page 18: 04   chuong 4 - cap nhat du lieu

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   chuong 4 - cap nhat du lieu

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   chuong 4 - cap nhat du lieu

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   chuong 4 - cap nhat du lieu

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   chuong 4 - cap nhat du lieu

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   chuong 4 - cap nhat du lieu

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   chuong 4 - cap nhat du lieu

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   chuong 4 - cap nhat du lieu

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   chuong 4 - cap nhat du lieu

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   chuong 4 - cap nhat du lieu

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   chuong 4 - cap nhat du lieu

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   chuong 4 - cap nhat du lieu

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   chuong 4 - cap nhat du lieu

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   chuong 4 - cap nhat du lieu

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   chuong 4 - cap nhat du lieu

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   chuong 4 - cap nhat du lieu

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   chuong 4 - cap nhat du lieu

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   chuong 4 - cap nhat du lieu

35

Dùng đối tượng DataAdapter

Data sourceDataAdapterDataTable

DataTable

DataSet

DataAdapter

FillFill

UpdateUpdateFillFill

UpdateUpdate

Page 36: 04   chuong 4 - cap nhat du lieu

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   chuong 4 - cap nhat du lieu

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   chuong 4 - cap nhat du lieu

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   chuong 4 - cap nhat du lieu

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   chuong 4 - cap nhat du lieu

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   chuong 4 - cap nhat du lieu

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   chuong 4 - cap nhat du lieu

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   chuong 4 - cap nhat du lieu

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   chuong 4 - cap nhat du lieu

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   chuong 4 - cap nhat du lieu

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   chuong 4 - cap nhat du lieu

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   chuong 4 - cap nhat du lieu

47

Tóm tắt chương 4