chuong 6
Chương 6:
Thao tác với dữ liệu
Nội dung chính
Sử dụng Data Form Wizard
Biến đổi và lọc dữ liệu
Truy nhập và sử dụng SQL Server Data
ADO.NET
Bắt lỗi dữ liệu
1. Sử dụng Data Form Wizard
Xây dựng Single-Table Data Form
Xây dựng Multi-Table Data Form
2. Biến đổi và lọc dữ liệu
Sử dụng Server Explorer
Server Explorer là công cụ dùng để quản lý các tài nguyên liên quan đến server
Để gán dữ liệu, sử dụng nút Data Connection trên Server Explorer và các nút con của nó.
Bổ sung kết nối dữ liệu vào project từ:
Data Form Wizard và những kết nối này được tự động hiển thị trên Server Explorer.
Trực tiếp trên Server Explorer.
Sử dụng Server Explorer
Server Explorer có thể là nguồn của các thao tác kéo thả:
Kéo thả CSDL sẽ tạo ra đối tượng SqlConnection
Kéo thả table, view, table column hoặc view column tạo ra đối tượng SqlDataAdapter.
Kéo thả stored procedure tạo ra đổi tượng SqlCommand.
Chú ý: Ba loại đối tượng trên đều nằm trong namespace System.Data. SqlClient.
Lọc dữ liệu
Là quá trình lựa chọn một số dữ liệu từ tập dữ liệu lớn.
Lọc dữ liệu với các đối tượng DataView
Đối tượng DataSet chứa hai tập hợp:
Tables - được tạo thành từ các đối tượng DataTable
Relations - được tạo thành từ các đối tượng DataRelation
Đối tượng DataView hỗ trợ nhiều thông tin hơn DataTable.
Có thể sắp xếp, lọc các bản ghi từ DataTable để xây dựng lên DataView.
Lọc ở Server
Lớp DataView phải lấy hết dữ liệu từ server và lưu trên client. Sau đó, đối tượng DataView mới chọn từ tập dữ liệu đó.
Sử dụng đối tượng SqlDataAdapter để lọc dữ liệu từ server.
Biến đổi dữ liệu với Lookups
Lookup là kỹ thuật thay thế một cột dữ liệu bằng một cột dữ liệu khác của cùng một bảng.
3. Truy nhập và sử dụng SQL Server Data
Nhiều ứng dụng .NET cần phải sử dụng CSDL để lưu trữ dữ liệu lâu dài.
SQL Server là CSDL thích hợp nhất.
Namespace System.Data.SqlClient phục vụ cho giao tiếp giữa ứng dụng .NET và SQL Server.
Ngôn ngữ được sử dụng để giao tiếp với SQL Server là T-SQL.
Có hai cách để gửi các câu truy vấn T-SQL tới SQL Server để xử lý:
Sử dụng các truy vấn đặc biệt - được thực hiện một cách trực tiếp
Sử dụng stored procedure - được lưu trên server.
3.1. Sử dụng truy vấn đặc biệt
4 câu lệnh T-SQL chính:
SELECT - l ấy d ữ li ệu t ừ CSDL
INSERT - b ổ sung d ữ li ệu m ới vào CSDL
UPDATE - thay đ ổi d ữ li ệu trong CSDL
DELETE - xoá d ữ li ệu trong CSDL
3.1.1. SELECT
Một câu SELECT đầy đủ như sau:
SELECT field_list
FROM table_list
WHERE where_clause
GROUP BY group_by_clause
HAVING having_clause
ORDER BY sort_clause
Mỗi dòng lệnh trên được gọi là một mệnh đề.
Mệnh đề SELECT và FROM là bắt buộc, các mệnh đề khác có thể tuỳ chọn.
Ví dụ:
SELECT OrderID, CustomerID
FROM Orders
Kết quả: trả về là 2 trường OrderID và CustomerID của tất cả các bản ghi trong bảng Order.
SELECT ...
Để hiển thị toàn bộ các bản ghi trong một bảng.
SELECT * FROM Orders
Thực hiện các phép tính trong mệnh đề SELECT.
SELECT OrderID, CAST(ShippedDate - OrderDate AS integer) AS Delay
FROM Orders
Biểu thức ShippedDate - OrderDate tính ra số ngày.
Hàm CAST yêu cầu SQL Server trả về kết quả là một số kiểu nguyên
Cột kết quả này được đặt tên là Delay.
SELECT ...
Lấy trường thông tin từ nhiều bảng.
SELECT OrderID, Customers.CustomerID
FROM Orders, Customers
Customers.CustomerID là tên đ ầy đ ủ, xác đ ịnh rõ trư ờng d ữ li ệu đư ợc l ấy t ừ b ảng nào.
INNER JOIN
INNER JOIN cho SQL Server biết cách kết hợp 2 bảng.
SELECT OrderID, Customers.CustomerID
FROM Orders INNER JOIN Customers
ON Orders.CustomerID = Customers.CustomerID
SQL Server xét từng dòng trong bảng Orders và đối chiếu nó với tất cả các hàng trong bảng Customers xem CustomerID của Order có trùng với CustomerID của Customer không.
INNER JOIN có thể xuất hiện nhiều lần trong một câu truy vấn, nếu có nhiều hơn hai bảng được kết hợp với nhau.
SELECT Orders.OrderID, Customers.CustomerID, Employees.EmployeeID
FROM Employees INNER JOIN
(Customers INNER JOIN Orders ON Customers.CustomerID = Orders.CustomerID)
ON Employees.EmployeeID = Orders.EmployeeID
Mệnh đề WHERE
Mệnh đề WHERE là mệnh đề điều kiện, nhằm xác định một dòng trong bảng có được xuất hiện trong tập kết quả của câu lệnh SELECT hay không.
SELECT * FROM Orders
WHERE ShipCountry = 'Brazil'
Kết hợp nhiều điều kiện kiểm tra trong mệnh đề WHERE
SELECT * FROM Orders
WHERE ShipCountry = 'Brazil'
AND Freight > 50 AND OrderDate <= '12/31/97'
Sử dụng ký tự thay thế trong mệnh đề WHERE.
Ký tự % được thay thế cho 0, 1 hoặc nhiều bất kỳ ký tự nào.
SELECT * FROM Customers
WHERE CustomerID LIKE 'B%'
Ký tự _ thay thế cho đúng 1 ký tự khác.
SELECT * FROM Customers
WHERE CustomerID LIKE 'BLON_'
Ký tự " thay thế cho một tập ký tự khác
SELECT * FROM Customers
WHERE CustomerID LIKE 'BLON"'
Dấu [] cho SQL Server biết có thể so sánh với một ký tự bất kỳ được liệt kê trong tập đã cho.
SELECT * FROM Customers
WHERE CustomerID LIKE 'BLON[D-P]'
Dấu [^] cho SQL Server biết để loại bỏ các ký tự nằm trong tập đã xác định.
SELECT * FROM Customers
WHERE CustomerID LIKE 'BLON[^A-O]'
Mệnh đề ORDERBY
Mệnh đề ORDERBY được sử dụng để sắp xếp dữ liệu hiển thị.
SELECT * FROM Customers
WHERE Country = 'Venezuela'
ORDER BY PostalCode ASC
Từ khoá ASC (tăng dần) hoặc DESC (giảm dần).
Sắp xếp theo nhiều tiêu chuẩn khác nhau. Nếu tiêu chuẩn thứ nhất bằng nhau thì xét tới tiêu chuẩn thứ hai ...
SELECT * FROM Customers
ORDER BY Country, PostalCode
hoặc
SELECT * FROM Customers
ORDER BY Country ASC, PostalCode DESC
Sử dụng biểu thức làm tiêu chuẩn sắp xếp.
SELECT * FROM Customers
ORDER BY Len([CompanyName])
Mệnh đề GROUP BY
Ta coi mệnh đề GROUP BY đã tạo ra các thùng chứa để phân loại dữ liệu.
SQL Server sẽ kiểm tra từng bản ghi trong bảng và gửi nó vào từng thùng thích hợp.
SELECT Count(CustomerID) AS CustCount, Country
FROM Customers
GROUP BY Country
ORDER BY Count(CustomerID) DESC
hoặc
SELECT Count(CustomerID) AS CustCount, Country
FROM Customers
GROUP BY Country
ORDER BY Country
Nhóm theo nhiều trường dữ liệu.
SELECT Count(CustomerID) AS CustCount, Region, Country
FROM Customers
GROUP BY Region, Country
Tạo ra một thùng cho mỗi liên kết giữa trường Region và Country; và phân loại Customer theo cả hai trường này một cách đồng thời.
Mệnh đề HAVING
Mệnh đề HAVING lọc các kết quả.
SELECT ProductID, Sum(Quantity) AS TotalSales
FROM [Order Details]
WHERE Quantity > 10
GROUP BY ProductID
HAVING Sum(Quantity) > 1000
ORDER BY Sum(Quantity) DESC
Kết quả: lọc tất cả các bản ghi trong bảng, tính tổng tất cả các hàng có thuộc tính Quantity > 10 và sau đó lọc tiếp các hàng này bằng tiêu chí trong mệnh đề HAVING.
Một số hàm phổ biến
T-SQL hỗ trợ như:
Count(): trả về số lượng các bản ghi
Sum(): tính tổng giá trị các bản ghi
Avg(): trả về giá trị trung bình của các bản ghi
Min(): trả về gía trị của bản ghi nhỏ nhất
Max(): trả về gía trị của bản ghi lớn nhất
3.1.2. INSERT
Mục đích của lệnh INSERT là bổ sung một hoặc nhiều dòng vào bảng.
INSERT INTO [Order Details]
VALUES (10248, 1, 12.00, 5, 0)
hoặc
INSERT INTO [Order Details]
(OrderID, ProductID, UnitPrice, Quantity, Discount)
VALUES (10248, 2, 12.00, 5, 0)
Nếu các trường trong bảng có giá trị mặc định hoặc có thể nhận giá trị Null thì ta có thể bỏ qua các trường đó.
Lấy giá trị từ câu lệnh SELECT để dùng trong câu lệnh SELECT.
INSERT INTO Products (SupplierID, ProductName, CategoryID )
SELECT SupplierID, 'Trout', 8
FROM Suppliers
3.1.3. UPDATE
Sử dụng câu lệnh UPDATE để cập nhật dữ liệu.
UPDATE Customers
SET ContactName = 'Maria Anderson'
WHERE CustomerID = 'ALFKI'
hoặc cập nhật nhiều trường dữ liệu trong bảng
UPDATE Customers
SET ContactName = 'Maria Anders', City = 'Berlin'
WHERE CustomerID = 'ALFKI'
Giá trị mới có thể là một biểu thức
UPDATE Products
SET UnitPrice = UnitPrice * 1.1
3.1.4. DELETE
Câu lệnh DELETE được sử dụng để xoá dữ liệu ra khỏi bảng.
Nguyên tắc để xây dựng câu truy vấn DELETE:
Xây dựng câu truy vấn SELECT để liệt kê các bản ghi cần xoá
Thay từ khoá SELECT bằng DELETE.
DELETE FROM BadCustomers WHERE CustomerID = 'GODOS'
3.2. Sử dụng Stored Procedure
Stored Procedure được lưu trên SQL Server và chạy nhanh hơn các câu truy vấn đặc biệt.
Xây dựng Stored Procedure:
Mở Server Explorer - mở Data Connections - chọn CSDL Northwind - chọn Stored Procedures - nhấn chuột phải trên nút Stored Procedure và chọn New Stored Procedure.
Nhập câu truy vấn sau:
CREATE PROCEDURE procFranceCustomers
AS
SELECT * FROM Customers
WHERE Country = 'France'
Thực thi Stored Procedure từ .NET
SqlCommand.CommandText = tên của Stored Procedure
SqlCommand.CommandType = CommandType.StoredProcedure
Sử dụng các tham số trong
Stored Procedure
SQL Server cho phép truyền thông tin cho Stored Procedure vào lúc thực thi.
CREATE PROC procCustomerSales
@CustomerID char(5), @TotalSales money OUTPUT
AS
SELECT @TotalSales = SUM(Quantity * UnitPrice)
FROM ((Customers INNER JOIN Orders
ON Customers.CustomerID = Orders.CustomerID)
INNER JOIN [Order Details]
ON Orders.OrderID = [Order Details].OrderID)
WHERE Customers.CustomerID = @CustomerID
@CustomerID và @TotalSales là hai biến (tham số).
Khi sử dụng Stored Procedure này, phải cung cấp giá trị cho tham số @CustomerID.
Tham số @TotalSales được đánh dấu là OUTPUT, tức là nó sẽ chứa giá trị trả về sau khi thực hiện xong Stored Procedure.
Đối tượng SqlCommand có một tập các tham số hỗ trợ quản lý các Stored Procedure được tham số hoá.
Sử dụng biến @@IDENTITY
SQL Server có thể tự sinh ra giá trị cho một cột khoá chính trong bảng mỗi khi ta bổ sung thêm một hàng mới.
SQL Server cung cấp biến @@IDENTIFY trả về giá trị mới nhất vừa được gán cho cột khoá chính tự động.
4. ADO.NET
ADO.NET là tên của tập các lớp nằm trên namespace:
System.Data, System.Data.Common,
System.Data.SqlTypes,
System.Data.SqlClient,
System.Data.OleDb;
ADO.NET được .NET Framework hỗ trợ làm việc với các CSDL quan hệ.
Mô hình đối tượng ADO.NET được chia thành 2 tập đối tượng khác nhau:
Data Provider: quản lý CSDL
DataSet: quản lý mô hình dữ liệu
4.1. Data Provider
Có 5 loại đối tượng Data Provider:
Connection,
Command,
Parameter,
DataReader,
DataAdapter.
Data Provider ...
Namespace System.Data.SqlClient chứa SQL Server Data Provider, bao gồm các đối tượng sau:
SqlConnection,
SqlCommand,
SqlParameter,
SqlDataReader,
SqlDataAdapter.
Namespace System.Data.OleDb chứa OLE DB Data Provider, bao gồm các đối tượng sau:
OleDbConnection,
OleDbCommand,
OleDbParameter,
OleDbDataReader,
OleDbDataAdapter.
OLE DB Data Provider được thiết kế để làm việc với SQL Server, Jet 4.0, và Oracle OLE DB Provider.
Chú ý: Tất cả các kỹ thuật áp dụng trên SQL Server Data Provider đều có thể áp dụng trên các đối tượng Data Provider khác.
SqlConnection
SqlConnection biểu diễn một kết nối liên tục tới nguồn dữ liệu SQL Server. ADO.NET tự động tạo ra một tập các kết nối.
BeginTransaction(): khởi tạo một phiên mới trên đối tượng SqlConnection.
Close(): trả về đối tượng SqlConnection cho tập kết nối ban đầu.
ConnectionString: xác định server mà đối tượng SqlConnection sử dụng
DataSource - xác định tên của server muốn kết nối tới.
Initial Catalog - xác định tên của CSDL sử dụng trên server.
Thông tin xác thực.
SSPI để dùng cho Windows authentication
UserID=username;Password=password để dùng cho SQL Server authentication.
CreateCommand(): trả về đối tượng SqlCommand
Open(): trả về đối tượng SqlConnection
Hầu hết các đối tượng SqlConnection đều được tạo ra bằng cách kéo thả.
SqlCommand và SqlParameter
SqlCommand biểu diễn những gì cần phải thực hiện, như: câu truy vấn đặc biệt hoặc tên của Stored Procedure.
SqlParameter biểu diễn một tham số của Stored Procedure.
Một số thành phần quan trọng của đối tượng SqlCommand:
CommandText: xác định câu lệnh cần đối tượng SqlCommand thực hiện.
CommandType: xác định kiểu câu lệnh cần thực hiện.
Connection: xác định đối tượng SqlConnection mà SqlCommand sử dụng.
CreateParameter(): tạo ra đối tượng SqlParameter cho đối tượng SqlCommand
ExecuteNonQuery(): thực hiện SqlCommand mà không trả về kết quả.
ExecuteReader(): thực hiện SqlCommand và trả kết quả vào đối tượng SqlDataReader
ExecuteScalar(): thực hiện SqlCommand và trả cột đầu tiên của dòng đầu tiên trong tập kết quả.
Parameters: chứa tập hợp các đối tượng SqlParameter của đối tượng SqlCommand
SqlDataReader
SqlDataReader là đối tượng được thiết kế nhằm lấy dữ liệu từ CSDL một cách nhanh nhất.
SqlDataReader được tạo ra bằng cách gọi phương thức ExecuteReader() của SqlCommand.
Chỉ có thể đọc kết quả chứa trong đối tượng SqlDataReader từ đầu đến cuối và không thể thay đổi nó.
Khi gọi phương thức SqlDataReader.Read() thì nó sẽ load hàng dữ liệu kế tiếp.
Nếu không có hàng nào được load thì phương thức Read() sẽ trả về false để báo hết dữ liệu.
SqlDataReader cung cấp các phương thức để lấy thứ tự của cột đó và trả về dữ liệu của cột; như GetString(), GetValue() ...
Không thể thực hiện SqlCommand có cùng đối tượng SqlConnection với SqlDataReader đang được mở.
Nên sử dụng phương thức Close() của SqlDataReader sau khi đã lấy xong dữ liệu.
SqlDataAdapter
SqlDataAdapter cung cấp cầu nối giữa các đối tượng Data Provider và DataSet.
DeleteCommand: xác định đối tượng SqlCommand được sử dụng để xoá các hàng trong nguồn dữ liệu.
Fill(): truyền dữ liệu từ nguồn dữ liệu tới DataSet.
InsertCommand: xác định đối tượng SqlCommand được sử dụng để bổ sung các hàng vào nguồn dữ liệu.
SelectCommand: xác định đối tượng SqlCommand được sử dụng để lấy các hàng từ nguồn dữ liệu.
Update(): truyền dữ liệu từ DataSet lên nguồn dữ liệu.
UpdateCommand: xác định đối tượng SqlCommand được sử dụng để cập nhật các hàng từ nguồn dữ liệu.
4.2. DataSet
DataSet biểu diễn dữ liệu ở mức trừu tượng.
AcceptChanges(): đánh dấu tất cả các thay đổi trong đối tượng DataSets đã được chấp nhận
Clear(): xoá tất cả dữ liệu trong DataSet
GetChanges(): trả về đối tượng DataSet chỉ chứa những dữ liệu đã bị thay đổi.
Merge(): trộn 2 đối tượng DataSet
Relations: xác định tập hợp các đối tượng DataRelation của DataSet
Tables: xác định tập hợp các đối tượng DataTable của DataSet.
DataTable
DataTable biểu diễn một bảng trong DataSet.
DataSet có thể chứa nhiều DataTable.
ChildRelations: xác định tập hợp các đối tượng DataRelation trỏ tới con của đối tượng DataTable.
Clear(): xoá tất cả dữ liệu trong đối tượng DataTable.
ColumnChanged(): sự kiện xảy ra khi dữ liệu tại một cột bị thay đổi.
ColumnChanging(): sự kiện xảy ra khi dữ liệu tại một cột đang bị thay đổi.
Columns: xác định tập hợp các đối tượng DataColumn
Constraints: xác định tập hợp các đối tượng Constraint
NewRow(): tạo ra một hàng mới, rỗng trong DataTable
ParentRelations: xác định tập hợp các đối tượng DataRelation trỏ tới cha của đối tượng DataTable.
PrimaryKey: xác định một mảng các đối tượng DataColumn, cung cấp khoá chính cho đối tượng DataTable.
RowChanged(): sự kiện xảy ra khi dữ liệu trong đối tượng DataRow bị thay đổi.
RowChanging(): sự kiện xảy ra khi dữ liệu trong đối tượng DataRow đang bị thay đổi.
RowDeleted(): sự kiện xảy ra khi một hàng bị xoá.
RowDeleting(): sự kiện xảy ra khi một hàng đang bị xoá.
Rows: xác định tập hợp các đối tượng DataRow.
Select(): xác định mảng các đối tượng DataRow thoả mãn tiêu chuẩn lựa chọn.
TableName: xác định tên của đối tượng DataTable.
DataRelation
DataSet có thể biểu diễn cấu trúc và dữ liệu của toàn bộ CSDL quan hệ.
DataRelation lưu thông tin về quan hệ giữa các DataTable trong DataSet.
ChildColumns: xác định tập hợp các đối tượng DataColumn là khoá ngoại trong quan hệ.
ChildKeyConstraint: trả về đối tượng ForeignKeyConstraint trong quan hệ.
ChildTable: xác định đối tượng DataTable ở phía khoá ngoại trong quan hệ.
ParentColumns: xác định tập hợp các đối tượng DataColumn là khoá chính trong quan hệ
ParentKeyConstraint: trả về đối tượng PrimaryKeyConstraint trong quan hệ.
ParentTable: xác định đối tượng DataTable ở phía khoá chính trong quan hệ.
RelationName: xác định tên của quan hệ.
DataRow
DataRow biểu diễn một hàng dữ liệu.
Khi lấy dữ liệu, bổ sung, cập nhật và xoá dữ liệu trong đối tượng DataSet, ta thường phải làm với các đối tượng DataRow.
BeginEdit(): bắt đầu biên tập đối tượng DataRow.
CancelEdit(): ngừng tiến trình soạn thảo.
Delete(): xoá đối tượng DataRow ra khỏi đối tượng DataTable là cha của nó.
EndEdit(): kết thúc quá trình biên tập và lưu tất cả sự thay đổi.
IsNull(): trả về true nếu cột đã cho chứa giá trị Null.
RowState: trả về thông tin trạng thái hiện thời của đối tượng DataRow.
DataColumn
DataColumn biểu diễn một cột trong DataSet.
Bằng cách sử dụng các đối tượng DataColumn, ta có thể xác định sự thay đổi cấu trúc của DataTable.
AllowDbNull: chỉ ra liệu DataColumn có thể chứa các giá trị Null.
AutoIncrement: chỉ ra liệu DataColumn có phải là identity column
ColumnName: tên của DataColumn
DataType: kiểu của DataColumn
DefaultValue: giá trị mặc định của DataColumn khi có một hàng dữ liệu mới được bổ sung.
MaxLength: kích thước lớn nhất chứa trong DataColumn.
Unique: xác định giá trị trong DataColumn có phải là duy nhất trong tất cả các hàng trong DataTable.
DataView
DataView biểu diễn khung nhìn của dữ liệu chứa trong DataTable.
DataView có thể chứa tất cả các đối tượng DataRow, hoặc chỉ một số hàng đã được lọc.
AddNew(): bổ sung một hàng mới vào DataView.
AllowDelete: chỉ ra có thể thực hiện thao tác xoá trên DataView.
AllowEdit: chỉ ra có thể thực hiện thao tác cập nhật trên DataView.
AllowNew: chỉ ra có thể thực hiện thao tác bổ sung trên DataView.
Count: số lượng các hàng trên DataView
Delete(): xoá một hàng trong DataView
Find(): tìm một hàng trong DataView
FindRows(): tìm một mảng các hàng thoả mãn điều kiện lặp.
Sort: sắp xếp dữ liệu trong DataView
Sử dụng DataSet
Trước khi ta sử dụng dữ liệu trong DataSet, ta phải lấy dữ liệu về DataSet.
Quá trình lấy dữ liệu về DataSet gồm 4 bước:
Xây dựng đối tượng SqlConnection để kết nối với CSDL
Xây dựng đối tượng SqlCommand để lấy dữ liệu cần thiết
Gán đối tượng SqlCommand cho thuộc tính SelectCommand của đối tượng SqlDataAdapter.
Gọi phương thức Fill của đối tượng SqlDataAdapter.
Sử dụng đối tượng DataSet trên nhiều bảng
DataSet có thể chứa nhiều DataTable.
B ằng cách s ử d ụng DataAdapter, có th ể k ết n ối m ột đ ối tư ợng DataSet v ới nhi ều b ảng trong CSDL SQL Server.
Đ ịnh ngh ĩa các đ ối tư ợng DataRelation đ ể bi ểu di ễn cho các quan h ệ gi ữa các đ ối tư ợng DataTable trong DataSet.
Soạn thảo dữ liệu với ADO.NET
Khi soạn thảo dự liệu, chúng ta phải chú ý tới sự khác biệt giữa mô hình dữ liệu và CSDL.
Khi thay đổi dữ liệu trên mô hình dữ liệu, thì những thay đổi này không được thể hiện trong CSDL, cho đến khi gọi phương thức Update() của SqlDataAdapter.
Cập nhật dữ liệu
Gán giá trị mới cho các thành phần trong DataRow.
Gọi phương thức Update() của SqlDataAdapter để ghi những thay đổi này lên CSDL.
Phải gán thuộc tính UpdateCommand của SqlDataAdapter với một đối tượng SqlCommand thích hợp.
Bổ sung dữ liệu
Gán đối tượng SqlCommand cho thuộc tính InsertCommand của đối tượng SqlDataAdapter.
Xoá dữ liệu
DataRow hỗ trợ phương thức Delete() để xoá toàn bộ đối tượng DataRow trên DataTable.
Gọi phương thức SqlDataAdapter.Update() để ghi những thay đổi này lên CSDL.
Soạn thảo trên điều khiển DataGrid
Nếu ta kết nối DataSet với điều khiển DataGrid, thì DataGrid cho phép thực hiện 3 thao tác soạn thảo cơ bản:
C ập nh ật d ữ li ệu trên m ột hàng, b ằng cách ch ọn c ột c ần c ập nh ật và nh ập giá tr ị m ới
B ổ sung hàng m ới, b ằng cách di chuy ển t ới cu ối danh sách và nh ập các giá tr ị vào dòng cu ối cùng trong DataGrid
Xoá hàng
5. Bắt lỗi dữ liệu
Bắt lỗi CSDL
Trong namespace System.Data.SqlClient có 2 đối tượng giúp bắt các lỗi liên quan đến SQL Server là: SqlException và SqlError
Bắt lỗi nhiều người sử dụng
Khi tạo ra đối tượng SqlCommand và để gán thuộc tính UpdateCommand của SqlDataAdapter, phải lựa chọn 2 chiến lược để giải quyết xung đột:
Tối ưu hoá điều khiển song song - cập nhật một hàng thành công chỉ khi hàng đó không còn sự thay đổi sau khi đã được load về DataSet.
Điều khiển song song "Last one wins" - cập nhật một hàng luôn luôn thành công miễn là hàng đó tồn tại.
Bạn đang đọc truyện trên: Truyen4U.Com