Truy cập cơ sở dữ liệu với .NET - Managing Data và Relationships: The DataSet ppsx

26 266 0
Truy cập cơ sở dữ liệu với .NET - Managing Data và Relationships: The DataSet ppsx

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

Truy cập sở liệu với NET Managing Data Relationships: The DataSet Lớp DataSet thiết kế thùng chứa liệu không kết nối Nó khơng có khái niệm kết nối liệu Thật vậy, liệu giữ DataSet không quan tâm đến nguồn sở liệu – mẫu tin chứa file CSV, đầu đọc từ thiết bị đo lường Một DataSet bao gồm tập bảng liệu, bảng tập cột liệu dịng liệu Thêm vào định nghĩa liệu, bạn định nghĩa link DataSet Mối quan hệ phổ biến DataSet parent-child relationship Một mẫu tin bảng (gọi Order) liên kết với nhiều mẫu tin bảng khác (Bảng Order_Details) Quan hệ định nghĩa đánh dấu DataSet Phần giải thích lớp dùng DataSet Data Tables Một data table giống bảng sở liệu vật lí – bao gồm cột với thuộc tính riêng, khơng chứa chứa nhiều dịng liệu Một data table định nghĩa khóa chínhm, bao gồm nhiều cột, chứa ràng buộc cột Tất thơng tin thể schema Có nhiều để định nghĩa schema cho bảng liệu riêng Chúng thảo luận sau phần giới thiệu cột liệu dòng liệu Sơ đồ vài đối tượng truy cập thơng qua bảng liệu: Một đối tượng DataTable (cũng DataColumn) có số mở rộng riêng liên quan đến thuộc tính Tập hợp nằm thơng tin user-defined gắng liền với đối tượng Ví dụ, cột đưa mặt nạ nhập liệu dùng để giới hạn giá trị hợp lệ cho cột – ví dụ số phúc lợi xã hội Mĩ Các thuộc tính mở rộng đặc biệt quan trọng liệu cấu trúc tầng trả cho client số tiến trình Bạn lưu chuẩn hợp lệ (như max) cho số cột Khi bảng liệu tạo ra, việc chọn liệu từ sở liệu, đọc liệu từ file, truy xuất thủ công mã, tập hợp Rows dùng để chứa giá trị trả Tập hợp Columns chứa thể DataColumn thêm vào bảng Những định nghĩa schema liệu, ví dụ kiểu liệu, tính khả rỗng, giá trị mặc định, vân vân Tập Constraints tạo ràng buộc khóa tính độc Thơng tin sơ đồ bảng liệu sử dụng việc biểu diễn bảng liệu DataGrid (chúng ta bàn vấn đề chương sau) Điều khiển DataGrid sử dụng thuộc tính kiểu liệu cột để định điều khiển dùng cho cột Một trường bit sở liệu biểu diễn checkbox DataGrid Nếu cột định nghĩa sở sơ đồ liệu NOT NULL, lựa chọn lưu trữ DataColumn kiểm tra người dùng cố gằng di chuyển khỏi dòng Data Columns Một đối tượng DataColumn định nghĩa thuộc tính cột DataTable, chẳng hạn kiểu liệu cột đó, chẳng hạn cột đọc, kiện khác Một cột tạo mã, tạo tự động thời gian chạy Khi tạo cột, tốt hết nên đặt cho tên; không thời gian chạy tự động sinh cho bạn tên theo định dạng Columnn, n mố sô tự động tăng Kiểu liệu cột cài đặt cách cung cấp cấu trúc nó, cách cài đặt thuộc tính DataType Một bạn load liệu vào bảng liệu bạn sửa lại kiểu liệu cột – không bạn nhận ngoại lệ Các cột liệu tạo để giữ kiểu liệu NET Framework sau: Boolean Decimal Int64 TimeSpan Byte Double Sbyte UInt16 Char Int16 Single UInt32 DateTime Int32 String UInt64 Một tạo, bước cài thuộc tính khác cho đối tượng DataColumn, chẳng hạn tính khả rỗng nullability, giá trị mặc định Đoạn mã sau số tùy chọn cài đặt DataColumn: DataColumn customerID = new DataColumn("CustomerID" , typeof(int)); customerID.AllowDBNull = false; customerID.ReadOnly = false; customerID.AutoIncrement = true; customerID.AutoIncrementSeed = 1000; DataColumn name = new DataColumn("Name" , typeof(string)); name.AllowDBNull = false; name.Unique = true; Các thuộc tính sau cài đặt DataColumn: Property Description AllowDBNull Nếu true, cho phép cột chấp nhận DBNull AutoIncrement Cho biết liệu cột số tự động tăng AutoIncrementSeed Giá trị khởi đầu cho cột AutoIncrement AutoIncrementStep Cho biết bước tăng giá trị tự động, mặc định Caption Có thể dùng cho việc biểu diễn tên cột hình Property Description ColumnMapping Cho biết cách cột ánh xạ sang XML DataSet lưu cách gọi phương thức DataSet.WriteXml ColumnName Tên cột Nó tự động tạo thời gian chạy không cài đặt cấu trúc DataType Kiểu giá trị cột DefaultValue Dùng để định nghĩa giá trị mặc định cho cột Expression Thuộc tính định nghĩa biểu thức dùng cho việct tính toán cột Data Rows Lớp cấu thành phần khác lớp DataTable Các cột data table định nghĩa thuộc tính lớp DataColumn Dữ liệu bảng thật truy xuất nhờ vào đối tượng DataRow Ví dụ sau trình bày cách truy cập dịng bảng liệu Mã ví dụ có sẵn thư mục 07_SimpleDatasetSql Trước tiên thông tin kết nối: string source = "server=(local)\\NetSDK;" + "uid=QSUser;pwd=QSPassword;" + "database=northwind"; string select = "SELECT ContactName,CompanyName FROM Customers"; SqlConnection conn = new SqlConnection(source); Mã sau giới thiệu lớp SqlDataAdapter, dùng để điền liệu cho DataSet SqlDataAdapter phát SQL, điền vào bảng Customers DataSet Chúng ta bàn lớp data adapter phần Populating a DataSet SqlDataAdapter da = new SqlDataAdapter(select, conn); DataSet ds = new DataSet(); da.Fill(ds , "Customers"); Trong mã đây, bạn ý cách dùng mục DataRow để truy xuất giá trị dịng Giá trị cột trả cách dụng mục cài đè Chúng cho phép bạn trả giá trị cho biết số, tên, DataColumn: foreach(DataRow row in ds.Tables["Customers"].Rows) Console.WriteLine("'{0}' from {1}" , row[0] ,row[1]); Một điều quan trọng DataRow phiên Điều cho phép bạn nhận giá trị khác cho dòng cụ thể Các phiên mô tả bảng sau: DataRowVersion Description Value Current Giá trị sẵn có cột Nếu khơng xảy hiệu chỉnh nào, mang giá trị gốc Nếu có hiệu chỉnh xảy ra, giá trị giá trị hợp lệ cuối cập nhật Default Giá trị mặc định (nói cách khác, giá trị mặc định cài đặt cho cột) Original Giá trị cột sở liệu vào lúc chọn Nếu phương thức AcceptChanges DataRow gọi, giá trị cập nhật thành giá trị Proposed Khi thay đổi diễn dịng truy lục giá trị thay đổi Nếu bạn gọi BeginEdit() mộg dòng tạo thay đổi, cột giữ giá trị phương thức EndEdit() CancelEdit() gọi Phiên cột dùng theo nhiều cách Một ví dụ cho việc cập nhật dịng sở liệu, câu lệnh SQL phổ biến sau: UPDATE Products SET Name = Column.Current WHERE ProductID = xxx AND Name = Column.Original; Rõ ràng mã không biên dịch, cách dùng cho giá trị gốc cột dòng Để trả giá trị từ DataRow, dùng phương thức mục thừa nhận giá trị DataRowVersion tham số Đoạn mã sau cách đạt tất giá trị cho cột DataTable: foreach (DataRow row in ds.Tables["Customers"].Rows ) { foreach ( DataColumn dc in ds.Tables["Customers"].Columns ) { Console.WriteLine ("{0} Current = {1}" , dc.ColumnName , row[dc,DataRowVersion.Current]); Console.WriteLine (" Default = {0}" , {0}" , row[dc,DataRowVersion.Default]); Console.WriteLine (" row[dc,DataRowVersion.Original]); } Original = } Mỗi dịng có cờ trạng thái gọi RowState, dùng để xác định thực thi cần thiết cho dịng cập nhật sở liệu Thuộc tính RowState cài đặ để theo dõi tất trạng thái thay đổi DataTable, thêm vào dịng mới, xóa dịng tại, thay đổi cột bên bảng Khi liệu cập nhật vào sở liệu, cờ trạng thái dùng để nhận biết thực thi SQL xảy Những cờ định nghĩa bảng liệt kê DataRowState: DataRowState Description Value Added Dòng vừa thêm vào tập hợp DataTable's Rows Tất dòng đựoc tạo máy khách cài đặt giá trị này, cuối phát câu lệnh SQL INSERT cập nhật cho sở liệu Deleted Giá trị cho biết dịng đánh dấu xố DataTable phương thức DataRow.Delete() Dòng tồn DataTable, trông thấy từ hình (trừ DataView Cách phổ biến để thay đổi liệu DataRow sử dụng số, bạn có số thay đổi bạn ccũgn cần gọi phương thức BeginEdit() EndEdit() methods Khi cập nhật tạo cột DataRow, kiện ColumnChanging phát dịng DataTable Nó cho phép bạn ghi đè lên thuộc tính ProposedValue lớp DataColumnChangeEventArgs, thay đổi muốn Cách cho phép giá tri cột có hiệu lực Nếu bạn gọi BeginEdit() trước tạo thay đổi, kiện ColumnChanging xảy Chúng cho phép bạn tạo thay đổi kép cố gọi EndEdit() Nếu bạn muốn phục hồi lại giá trị gốc, gọi CancelEdit() Một DataRow liên kết với vài dòng khác liệu Điều cho phép tạo liên kết điều khiển dịng, kiểu master/detail DataRow chứa phương thức GetChildRows() dùng để thay đổi mảng dòng liên quan đến cột từ khác DataSet dịng Chúng trình bày phần Data Relationships nằm phần sau chương Schema Generation Có ba cách để tạo schema cho DataTable Đó là:  Hãy để thời gian chạy làm điều giúp bạn  Viết mã tạo bảng  Dùng trình tạo sơ đồ XML Runtime Schema Generation Ví dụ DataRow mã để chọn liệu từ sở liệu tạo môt DataSet: SqlDataAdapter da = new SqlDataAdapter(select , conn); DataSet ds = new DataSet(); da.Fill(ds , "Customers"); Nó rõ ràng dễ sử dụng, có mơt vài trở ngại Một ví dụ bạnc phải làm việc với tên cột chọn từ sở liệu, điều tốt thơi, chăc muốn đổi tên vật lí thành tên thân thiện Bạn thực việc đổi tên cách thủ công mệnh đề SQL, chẳng hạn SELECT PID AS PersonID FROM PersonTable; bạn cảnh báo không nên đổi tên cột SQL, thay cột thật cần để tên xuất hình thân thiện Một vấn đề tiềm ẩn khác không trình phát DataTable/DataColumn tự động bạn khơng thể điều khiển vượt kiểu cột, kiểu thời gian chạy lựa chọn cho bạn Nó có ích việc chọn kiểu liệu cho bạn, nhiều trường hợp bạn muốn có nhiều khả Ví dụ bạn cần định nghĩa tập kiểu giá trị dùng cho cột, mã cần phải viết lại Nếu bạn chấp nhận kiểu giá trị măc định cho cột đươc tạo thời gian chạy, số nguyên 32-bit Cuối điều quan trọng, sử dụng trình tạo bảng tự động, bạn truy xuất liệu access to the data within the DataTable – you are at the mercy of indexers, which return instances of object rather than derived data types If you like sprinkling your code with typecast expressions then skip the following sections Hand-Coded Schema Việc phát mã để tạo DataTable, với đầy đủ cột việc tương đối đơn giản Các ví dụ phần truy cập bảng Products từ sỏ liệu Northwind Mã 08_ManufacturedDataSet phần sẵn có ví dụ Dưới mã để tạo thủ cơng DataTable, có sơ đồ public static void ManufactureProductDataTable(DataSet ds) { DataTable products = new DataTable("Products"); products.Columns.Add(new DataColumn("ProductID", typeof(int))); products.Columns.Add(new DataColumn("ProductName", typeof(string))); products.Columns.Add(new DataColumn("SupplierID", typeof(int))); products.Columns.Add(new DataColumn("CategoryID", typeof(int))); products.Columns.Add(new DataColumn("QuantityPerUnit", typeof(string))); products.Columns.Add(new DataColumn("UnitPrice", typeof(decimal))); products.Columns.Add(new DataColumn("UnitsInStock", typeof(short))); products.Columns.Add(new DataColumn("UnitsOnOrder", typeof(short))); products.Columns.Add(new DataColumn("ReorderLevel", typeof(short))); products.Columns.Add(new DataColumn("Discontinued", typeof(bool))); ds.Tables.Add(products); } Bạn sửa đổi mã ví dụ DataRow sử dụng định nghĩa sau: string source = "server=localhost;" + "integrated security=sspi;" + "database=Northwind"; string select = "SELECT * FROM Products"; SqlConnection conn = new SqlConnection(source); SqlDataAdapter cmd = new SqlDataAdapter(select, conn); DataSet ds = new DataSet(); ManufactureProductDataTable(ds); cmd.Fill(ds, "Products"); foreach(DataRow row in ds.Tables["Products"].Rows) Console.WriteLine("'{0}' from {1}", row[0], row[1]); Phương thức ManufactureProductDataTable() tạo DataTable mới, thay đổi cho cột, sau thêm vào danh sách bảng DataSet DataSet có mục nắm giữ tên bảng trả DataTable gọi Ví dụ khơng thật bảo tồn kiểu, Tơi dùng mục cột để lấy liệu Tốt hết dùng lớp (hoặc lớp) để điều khiển DataSet, DataTable, DataRow, dùng để định nghĩa truy xuất bảo vệ kiểu cho bảng, dịng, cột Bạn viết mã – cơng việc chán nản, bạn sử dụng lớp bảo vệ kiểu sẵn có .NET Framework có hỗ trợ cho việc dùng sơ đồ XML để định nghĩa DataSet, DataTable, lớp khác mà làm phần Phần XML Schemas nằm chương bàn phương thức này, trước tiên, xem xét quan hệ ràng buộc DataSet Các quan hệ liệu Khi viết ứng dụng, thường cần phải có sẵn nhiều bảng để lưu trữ thông tin Lớp DataSet nơi để chứa thông tin Lớp DataSet thiết kế để tạo nên mối quan hệ các bảng Mã phần thiết kế để tạo tay mối quan hệ cho hai bảng liệu Vì vậy, bạn khơng có SQL Server sở liệu NorthWind, bạn chạy ví dụ Mã có sẵn thư mục 09_DataRelationships: DataSet ds = new DataSet("Relationships"); ds.Tables.Add(CreateBuildingTable()); ds.Tables.Add(CreateRoomTable()); ds.Relations.Add("Rooms", ds.Tables["Building"].Columns["BuildingID"], ds.Tables["Room"].Columns["BuildingID"]); Các bảng đơn giản chứa khóa trường tên, bảng Room có khóa ngoại BuildingID Sau thêm số liệu cho bảng foreach(DataRow theBuilding in ds.Tables["Building"].Rows) { DataRow[] children = theBuilding.GetChildRows("Rooms"); int roomCount = children.Length; Console.WriteLine("Building {0} contains {1} room{2}", theBuilding["Name"], roomCount, roomCount > ? "s" : ""); // Loop through the rooms foreach(DataRow theRoom in children) Console.WriteLine("Room: {0}", theRoom["Name"]); } Sự khác biệt lớn DataSet kiểu đối tượng Recordset cổ điển biểu quan hệ Trong Recordset cổ điển, quan hệ biểu diễn cột giả dịng Cột thân Recordset lập lại Trong ADO.NET, quan hệ đơn giản lời gọi phương thức GetChildRows(): DataRow[] children = theBuilding.GetChildRows("Rooms"); Phương thức có số kiểu, ví dụ cách dùng tên quan hệ Nó trả mảng dịng cập nhật mục đề cập ví dụ trước Thích thú quan hệ liệu xem xét theo hai cách Khơng từ cha đến con, mà tìm dịng cha mẫu tin cách sử dụng thuộc tính ParentRelations lớp DataTable Thuộc tính trả DataRelationCollection, truy cập kí hiệu mảng [] (ví dụ, ParentRelations["Rooms"]), dùng luân phiên phương thức GetParentRows() mã đây: foreach(DataRow theRoom in ds.Tables["Room"].Rows) { DataRow[] parents = theRoom.GetParentRows("Rooms"); foreach(DataRow theBuilding in parents) Console.WriteLine("Room {0} is contained in building {1}", theRoom["Name"], theBuilding["Name"]); } Có hai phương thức với nhiều cài đặt đè khác để trả dòng cha – GetParentRows() (trả mảng dòng), GetParentRow() (trả dòng cha quan hệ) Ràng buộc liệu Thay đổi kiểu liệu cột tạo máy đơn không khả tuyệt vời DataTable ADO.NET cho phép bạn tạo tập ràng buộc cột (hoặc nhiều cột), dùng cho nguyên tắc chuẩn hóa liệu Thời gian chạy hỗ trợ kiểu ràng buộc sau, lớp không gian System.Data Constraint Description ForeignKeyConstraint Thực liên kết hai DataTables DataSet UniqueConstraint Cài đặt khóa Bảo đảm tính độc cột Một điều phổ biến bảng sở liệu quan hệ, bạn cung cấp khóa chính, dựa vào nhiều cột DataTable Mã sau tạo khóa cho bảng Products, mà sơ đồ tạo thủ cơng ví dụ trên, tìm thấy thư mục 08_ManufactureDataSet Chú ý khóa cảu bảng kiểu ràng buộc Khi khóa thêm vào DataTable, thời gian chạy phát ràng buộc độc khóa Bởi thực tế khơng tồn kiều ràng buộc PrimaryKey – khóa đơn giản ràng buộc nhiều cột public static void ManufacturePrimaryKey(DataTable dt) { DataColumn[] pk = new DataColumn[1]; pk[0] = dt.Columns["ProductID"]; dt.PrimaryKey = pk; } Một khóa bao gồm vài cột, xem mảng DataColumns Một khóa bảng cài đặt cột đơn giản còi mảng cột làm nên thuộc tính Để kiểm tra ràng buộc bảng, bạn lập lại ConstraintCollection Đối với ràng buộc tự sinh ví dụ trên, tên ràng buộc Constraint1 Nó khơng phải tên tốt, tốt nên tạo ràng buộc trước sau định nghĩa cột tạo nên khóa chính, làm Là lập trình viên sở liệu lâu năm, nhận thấy ràng tên ràng buộc cần phải thật rõ nghĩa Mã định danh ràng buộc trước tạo khóa chính: DataColumn[] pk = new DataColumn[1]; pk[0] = dt.Columns["ProductID"]; dt.Constraints.Add(new UniqueConstraint("PK_Products", pk[0])); dt.PrimaryKey = pk; Ràng buộc áp dụng cho cột tùy thích Tạo khóa ngoại Ngồi ràng buộc nhất, DataTable chứa ràng buộc khóa ngoại Nó thường áp dụng cho mối quan hệ chủ tớ, dùng để tạo bảng cột bảng bạng tạo ràng buộc xác Một quan hệ chủ tớ mẫu tin cha có nhiều mẫu tin con, liên kết với khóa mẫu tin cha Một ràng buộc khóa ngoại thực thi bảng bên DataSet, ví dụ sử dụng bảng Categories sở liệu Northwind, tạo ràng buộc với bảng Products table Bước tạo bảng liệu cho bảng Categories Ví dụ 08_ManufactureDataSet: DataTable categories = new DataTable("Categories"); categories.Columns.Add(new DataColumn("CategoryID", typeof(int))); categories.Columns.Add(new DataColumn("CategoryName", typeof(string))); categories.Columns.Add(new DataColumn("Description", typeof(string))); categories.Constraints.Add(new UniqueConstraint("PK_Categories", categories.Columns["CategoryID"])); categories.PrimaryKey = new DataColumn[1] {categories.Columns["CategoryID"]}; Dòng cuối mã tạo khóa cho bảng Categories Khóa cột đơn, tất nhiên thể tạo khóa nhiều cột dùng kí tự mảng Sau tơi tạo ràng buộc hai bảng: DataColumn parent = ds.Tables["Categories"].Columns["CategoryID"]; DataColumn child = ds.Tables["Products"].Columns["CategoryID"]; ForeignKeyConstraint fk = new ForeignKeyConstraint("FK_Product_CategoryID", parent, child); fk.UpdateRule = Rule.Cascade; fk.DeleteRule = Rule.SetNull; ds.Tables["Products"].Constraints.Add(fk); Ràng buộc dùng để liên kết Categories.CategoryID Products.CategoryID Có bốn cấu trúc khác cho ForeignKeyConstraint, khuyên bạn nên dùng tên ràng buộc Tạo ràng buộc Update Delete Bổ sung cho phần định nghĩa tất nhiên vài kiểu ràng buộc bảng cha con, bạn định nghĩa phải làm ràng buộc cập nhật Ví dụ tạo qui tắc cập nhật qui tắc xóa Những qui tắc dùng mơt kiện phát cột (hoặc dòng) bảng cha, qui tắc dùng để định chuyện xảy bảng Có bốn qui tắc khác áp dụng liệt kê Rule enumeration:  Cascade – Nếu khóa cha cập nhật sau copy giá trị cho tất mã khóa Nếu mẫu cha bị xố, xóa ln mẫu Nó tùy chọn mặc định  None – Khơng làm hết Tùy chọn bỏ dịng mơ cơi khỏi bảng liệu  SetDefault – Mỗi thay đổi dòng mang giá trị mặc định nó, định nghĩa trước  SetNull – Tất dòng chọn DBNull Chú ý: Các ràng buộc có hiệu lực DataSet thuộc tính EnforceConstraints DataSet true Tơi đổi lớp dùng để tạo nên DataSet, cách tạo thủ công lớp mã Có cách khác để định nghĩa DataTable, DataRow, DataColumn, DataRelation, Constraint – cáchc dùng file sơ đồ XML cơng cụ XSD sẵn có NET Đoạn trình bày cách để tạo sơ đồ đơn giản tạo lớp bảo vệ kiểu để truy cập liệu bạn ... lớp SqlDataAdapter, dùng để điền liệu cho DataSet SqlDataAdapter phát SQL, điền vào bảng Customers DataSet Chúng ta bàn lớp data adapter phần Populating a DataSet SqlDataAdapter da = new SqlDataAdapter(select,... XML Runtime Schema Generation Ví dụ DataRow mã để chọn liệu từ sở liệu tạo môt DataSet: SqlDataAdapter da = new SqlDataAdapter(select , conn); DataSet ds = new DataSet( ); da.Fill(ds , "Customers");... thiết cho dịng cập nhật sở liệu Thuộc tính RowState cài đặ để theo dõi tất trạng thái thay đổi DataTable, thêm vào dòng mới, xóa dịng tại, thay đổi cột bên bảng Khi liệu cập nhật vào sở liệu, cờ trạng

Ngày đăng: 30/07/2014, 18:20

Từ khóa liên quan

Tài liệu cùng người dùng

Tài liệu liên quan