Bài giảng Lập trình cơ sở dữ liệu - Chương 3: Lấy dữ liệu theo cách Disconnected - DataAdapter

Khái niệm DataAdapter Lớp DataAdapter Truy vấn 1 bảng Truy vấn nhiều bảng Truy vấn lược đồ CSDL Ánh xạ - Mapping

ppt36 trang | Chia sẻ: thuongdt324 | Lượt xem: 506 | 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 3: Lấy dữ liệu theo cách Disconnected - DataAdapter, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
LẤY DỮ LIỆU THEO CÁCH Disconnected – DataAdapterChương 3Nội dungKhái niệm DataAdapterLớp DataAdapterTruy vấn 1 bảngTruy vấn nhiều bảngTruy vấn lược đồ CSDLÁnh xạ - MappingKhái niệm DataAdapterĐịnh nghĩa “DataAdapter”DataAdapter là 1 đối tượng giúp chúng ta dùng các đối tượng connected (xxxConnection, xxxCommand) để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 sourceKhái niệm DataAdapterĐặc điểm của DataAdapterDataAdapter là “cầu nối” giữa phần connected và phần disconnected trong ADO.NETDataAdapter được dùng khi DataSet/DataTable cần tương tác với data sourceDataAdapter có thể dùng để lấy dữ liệu từ CSDL và cập nhật dữ liệu vào CSDLKhái niệm DataAdapterData sourceDataAdapterDataTableDataTableDataSetDataAdapterFillUpdateFillUpdateLớp DataAdapterCấu trúc DataAdapterMô hình DataAdapterTạo đối tượng DataAdapterMột số properties và phương thức DataAdapterLớp DataAdapter Cấu trúc DataAdapterDataAdapter gồm có 4 đối tượng Command. Mỗi đối tượng làm một nhiệm vụ riêng biệtSelectCommand InsertCommandUpdateCommandDeleteCommand Lớp DataAdapter Mô hình DataAdaptersp_SELECTXxxCommandSelectCommandUpdateCommandInsertCommandDeleteCommandXxxDataAdapterXxxCommandXxxCommandXxxCommandXxxConnectionsp_UPDATEsp_INSERTsp_DELETEXxxDataReaderLớp DataAdapter Tạo đối tượng DataAdapterSử dụng đối tượng xxxDataAdapter phụ thuộc vào Data sourceSqlDataAdapterOleDbDataAdapterOracleDataAdapterOdbcDataAdapterLớp DataAdapter Tạo đối tượng DataAdapterSqlDataAdapter da; da = new SqlDataAdapter();da = new SqlDataAdapter(SqlCommand selectCmd);da = new SqlDataAdapter(string selectCmd, SqlConnection conn);da = new SqlDataAdapter(string selectCmd, string strConn);Tạo đối tượng DataAdapter cần 2 thông tinConnectionCommandGán đối tượng Command cho DataAdapterSqlCommand selectCmd;da.SelectCommand = selectCmd;Lớp DataAdapter Một số properties và phương thức DataAdapterDataAdapter propertiesSelectCommandInsertCommandUpdateCommandDeleteCommandMethodsFill(DataTable table) Fill(DataSet ds) Fill(DataSet ds, string srcTable)FillSchema(DataSet ds, SchemaType type)Update(DataSet ds) Update(DataTable table)Truy vấn 1 bảng5 bước cơ bảnBước 1: Tạo đối tượng DataTableBước 2: Tạo đối tượng ConnectionBước 3: Tạo đối tượng Command chứa 1 câu truy vấn SelectBước 4: Tạo đối tượng DataAdapterBước 5: Gọi phương thức Fill Truy vấn 1 bảngDùng đối tượng DataTable để lưu dữ liệu class MyForm : Form { private DataTable svTable; public MyForm() { InitializeComponent(); svTable = new DataTable(); } }Truy vấn 1 bảngTạo đối tượng DataAdapter và lấy dữ liệu private void buttonFillData_Click(object sender, EventArgs e) { string strConn = ; string strSql = “Select ”; SqlConnection conn = new SqlConnection(strConn); SqlCommand cmd = conn.CreateCommand(); cmd.CommandText = strSql; SqlDataAdapter da = new SqlDataAdapter(cmd); da.Fill(svTable); conn.Dispose(); }Truy vấn 1 bảngNhững thao tác thực hiện khi phương thức Fill được gọiMở kết nốiTạo đối tượng DataTable để chứa dữ liệu nếu chưa có bảng đó trong DataSet (tên bảng mặc định là Table, Table1, ... Nếu không chỉ rõ tên bảng trong hàm Fill)Lấy dữ liệu đưa vào DataTableĐóng kết nốiTruy vấn nhiều bảng5 bước cơ bảnBước 1: Tạo đối tượng DataSetBước 2: Tạo đối tượng ConnectionBước 3: Tạo đối tượng Command chứa nhiều câu truy vấn selectBước 4: Tạo đối tượng DataAdapterBước 5: Gọi phương thức FillTruy vấn nhiều bảngDùng đối tượng DataSet để lưu dữ liệu class MyForm : Form { private DataSet dsData; public MyForm() { InitializeComponent(); dsData = new DataSet(); } }Truy vấn nhiều bảngTạo đối tượng DataAdapter và lấy dữ liệu private void buttonFillData_Click(object sender, EventArgs e) { string strConn = ; string strSql = “Select ; Select ”; SqlConnection conn = new SqlConnection(strConn); SqlCommand cmd = conn.CreateCommand(); cmd.CommandText = strSql; SqlDataAdapter da = new SqlDataAdapter(cmd); da.Fill(dsData); conn.Dispose(); }Truy vấn nhiều bảngChú ýDataSet có thể chứa nhiều bảngCùng thuộc 1 data sourceThuộc nhiều data source khác nhauTruy vấn nhiều bảng có thể thực hiện bằng cách khác:Truy vấn nhiều lần, mỗi lần 1 bảngKhi gọi da.Fill(dsData);Tên bảng lần lược được đặt tên là: Table, Table1, Table2, ...Khi gọi da.Fill(dsData, “Name”);Tên bảng lần lược được đặt tên là: Name, Name 1, Name 2, ...Truy vấn lược đồ CSDLVấn đềKhi gọi phương thức Fill nhiều lần trên 1 DataTable/DataSet, dữ liệu sẽ được thêm vào DataTable/DataSet nhiều lần  vi phạm ràng buộc CSDLNguyên doDataAdapter không thể xác định được các dòng trùng lập do không có thông tin lược đồ (shema) của các DataTables bên trong DataSetTruy vấn lược đồ CSDLCác cách tạo lược đồ Tự viết code, dựa trên các lớp DataColumn, DataRelation, Dùng phương thức FillSchema()Các bước tiến hành như truy vấn 1 bảng/truy vấn nhiều bảngChọn các cột có chứa các ràng buộc (khóa chính, khóa ngoại, duy nhất, )Thay thế phương thức Fill bằng phương thức FillSchemaTruy vấn lược đồ CSDLprivate void buttonFillSchema_Click(object sender, EventArgs e) { string strConn = ; string strSql = “Select * from ; Select * from ”; SqlConnection conn = new SqlConnection(strConn); SqlCommand cmd = conn.CreateCommand(); cmd.CommandText = strSql; SqlDataAdapter da = new SqlDataAdapter(cmd); da.FillSchema(dsData, SchemaType.Source); conn.Dispose(); }Truy vấn lược đồ CSDLPhương thức FillSchemaFillSchema(DataSet, SchemaType)FillSchema(DataTable, SchemaType)FillSchema(DataSet, SchemaType, String)Ánh xạ - MappingKhái niệm MappingGiải pháp mapping của SQLGiải pháp mapping của ADO.NETÁnh xạ - Mapping Khái niệm MappingThông thường, các tên bảng/cột trong CSDL không phù hợp khi đưa lên ứng dụng. Để thay đổi tên các đối tượng trong CSDL chúng ta dùng kỹ thuật ánh xạ - mapping. Khi đó code của chúng ta có thể sử dụng các đối tượng này theo tên chúng ta đã chọn Có 2 cách mappingSQL: Dùng từ khóa AS của SQL (bí danh)ADO.NET: ADO.NET cung cấp giải pháp mapping thông qua các đối tượng DataTableMapping, DataColumnMapping Ánh xạ - Mapping Giải pháp mapping của SQLDùng từ khóa AS của SQLSelect tenCot as ‘Tên Cột Mới’ From tenBangSelect tenCot as [Tên Cột Mới] From tenBangÁnh xạ - Mapping Giải pháp mapping của SQLHạn chếKhông thể ánh xạ tên bảngGiải phápDùng thuộc tính TableName của DataTable Ánh xạ - Mapping Giải pháp mapping của ADO.NETCơ chế mapping trong ADO.NETKhi Fill dữ liệu vào DataSet, data adapter sẽ kiểm tra thuộc tính TableMappings của data adapter để xác định xem chúng ta có định nghĩa các quy tắc mapping hay không.Nếu TableMappings bằng rỗng (default) thì tên cột trong CSDL được dùng làm tên trong các DataTablesÁnh xạ - Mapping Giải pháp mapping của ADO.NET4 bước thực hiện mappingBước 1: Tạo các đối tượng DataColumnMapping cho từng cột muốn mappingBước 2: Tạo đối tượng DataTableMapping cho bảng muốn mappingBước 3: Thêm các đối tượng DataColumnMapping vào đối tượng DataTableMapping thông qua thuộc tính ColumnMappingsBước 4: Thêm đối tượng DataTableMapping vào DataAdapter thông qua thuộc tính TableMappingsÁnh xạ - Mapping Giải pháp mapping của ADO.NETĐoạn mã tổng quát// Định nghĩa Connection// Định nghĩa Command// Tạo data adapter: daDoDataMapping(da);// Fill vào datasetÁnh xạ - Mapping Giải pháp mapping của ADO.NETCú pháp và Đoạn mã tổng quátprivate void DoDataMapping(SqlDataAdapter da) { // Tạo các DataColumnMapping DataColumnMapping col1 = new DataSolumMapping(“source col”, “dataSet col”); DataColumnMapping col2 = new DataSolumMapping(“source col”, “dataSet col”); // Tạo các DataTableMapping DataTableMapping tb = new DataTableMapping (“source table”, “dataSet table”); // Thêm các DataColumnMapping vào DataTableMapping tb.ColumnMappings.Add(col1); tb.ColumnMappings.Add(col1); // Thêm DataTableMapping vào data adapter da.TableMappings.Add(tb); }Ánh xạ - Mapping Giải pháp mapping của ADO.NETVí dụsinhvien(masv, hoten, tuoi)Đổi tênmasv  mã sinh viênhoten  họ và têntuoi  tuoiTên bảng khi Fill là ‘sinhvien’  sinh viênÁnh xạ - Mapping Giải pháp mapping của ADO.NETstring strConn = “"; SqlConnection conn = new SqlConnection(strConn); SqlCommand cmd = conn.CreateCommand(); cmd.CommandText = "select * from sinhvien"; SqlDataAdapter da = new SqlDataAdapter(cmd); DoDataMappings(da); da.Fill(ds, "sinhvien"); dataGridView.DataSource = ds.Tables[“sinh viên”]; string s; s = (string)ds.Tables[0].Rows[0]["mã sinh viên"]; MessageBox.Show(s); conn.Dispose();Ví dụÁnh xạ - Mapping Giải pháp mapping của ADO.NETprivate void DoDataMappings(SqlDataAdapter da) { DataColumnMapping masvCol = new DataColumnMapping("masv","mã sinh viên"); DataColumnMapping hotenCol = new DataColumnMapping("hoten", "họ và tên"); DataColumnMapping tuoiCol = new DataColumnMapping("tuoi", "tuổi"); DataTableMapping sinhvienTab = new DataTableMapping("sinhvien", "sinh viên"); sinhvienTab.ColumnMappings.Add(masvCol); sinhvienTab.ColumnMappings.Add(hotenCol); sinhvienTab.ColumnMappings.Add(tuoiCol); da.TableMappings.Add(sinhvienTab); }Ánh xạ - Mapping Giải pháp mapping của ADO.NETChú ýNếu chỉ muốn mapping tên bảng thì không cần tạo các đối tượng DataColumnMappingTạo các đối tượng mapping trước khi gọi phương thức FillTên bảng nguồn trong khi tạo đối tượng DataTableMapping phải giống với tên bảng khi Fill. Nếu khi Fill không chỉ tên bảng thì tên bảng sẽ là: Table, Table1, Table2, ... Tóm tắt chương 3