24/05/2018, 14:38

Lập trình với Microsoft SQL Server CE

Ngôn ngữ truy vấn có cấu trúc (SQL) Server 2000 Windows CE Edition (SQL Server CE) rất nhỏ so với bộ máy CSDL Microsoft's SQL Server 2000. Mặc dù kích cỡ của nó như vậy, nhưng SQL Server CE cung cấp đủ để lưu trữ dữ liệu và các chức năng. ...

Ngôn ngữ truy vấn có cấu trúc (SQL) Server 2000 Windows CE Edition (SQL Server CE) rất nhỏ so với bộ máy CSDL Microsoft's SQL Server 2000. Mặc dù kích cỡ của nó như vậy, nhưng SQL Server CE cung cấp đủ để lưu trữ dữ liệu và các chức năng.

SQL Server CE hỗ trợ CSDL có dung lượng lớn nhất đến 2GB. SQL Server CE hỗ trợ tập con các ngôn ngữ định nghĩa dữ liệu và ngôn ngữ thao tác dữ liệu. Có hỗ trợ nhiều cột chỉ số, khóa chính, ràng buộc.

Khi phát triển ứng dụng SQL Server CE, chúng ta cần phải thêm hai assembly references để dự án của chúng ta làm việc như đoạn mã. SQL Server CE quản lý sự tồn tại

System.Data.SqlServerCe
. Chúng ta sẽ cần thêm một tham chiếu
System.Data.Common
. Như trong đoạn mã sau:
using System.Data;
    using System.Data.Common;
    using System.Data.SqlServerCe;
    

Có hai lựa chọn để tạo CSDL SQL Server CE. Một là sử dụng SQL Server CE Query Analyzer để dùng đồ họa tạo và thiết kế CSDL SQL Server CE. Để học nhiều hơn về Query Analyzer, xem Microsoft SQL Server CE Books Online.

Chúng ta có thể tạo một CSDL SQL Server CE bằng cách lập trình sử dụng lớp SQL Server CE Data Provider định nghĩa trong không gian tên

System.Data.SqlServerCE
. Khi tạo một CSDL bằng cách lập trình, chúng ta chỉ cần tác động đến lớp SQL Server CE Data Provider,
System.Data.SqlServerCe.SqlCeEngine
. Lớp
SqlCeEngine
cung cấp khả năng lập trình truy nhập SQL Server CE.
SqlCeEngine
cung cấp hai chức năng chính: khả năng tạo một CSDL mới và khả năng compact một CSDL đã có.

Để tạo một CSDL SQL Server CE bằng cách lập trình rất đơn giản. Chúng ta làm theo ba bước sau:

c1: Trước tiên chúng ta đảm bảo răng chưa tồn tại fiel CSDL (.sdf) trước khi tạo CSDL. Nếu tồn tại, hãy xóa khi bạn tạo CSDL mới.

c 2: Thể hiện lớp

SqlCeEngine 
phải được cài đạt và khởi tạo cùng với chuỗi kết nối.

c 3: Gọi phương thức

CreateDataBase
trên
SqlCeEngine
.

Listing 5.2 Tạo một CSDL SQL S e rver CE

public void CreateNewDatabase() {
    if(File.Exists("tempdb.sdf") File.Delete("tempdb.sdf");
    string connStr = "Data Source = tempdb.sdf;
    Password = testing123" 
    using(SqlCeEngine engine = new SqlCeEngine(connStr)) {
    engine.CreateDatabase();
}
}

Sau khi tạo một CSDL SQL Server CE, bước tiếp theo thêm các bảng vào CSDL. Chúng ta có thể dùng đồ họa bằng cách sử dụng SQL Server CE Query Analyzer hoặc bằng cách lập trình sử dụng lớp SQL Server CE Data Provider.

Để lập trình tạo bảng CSDL, chúng ta sẽ cần kết nối với CSDL bằng cách sử dụng lớp

SqlCeConnection
và đưa ra các câu lệnh DDL bằng cách sử dụng lớp
SqlCeCommand.

SQL Server CE hỗ trợ một tập con của DDL. Bảng 5.2 mô tả các câu lệnh DDL hỗ trợ.

Các câu lện DDL hỗ trợ bởi SQL Server CE

Các kiểu dữ liệu SQL Server CE hỗ trợ.

Các kiểu dữ liệu SQL Server CE hỗ trợ

Bây giờ chúng ta học cách tạo cấu trúc một CSDL SQL Server. Chúng ta tạo CSDL bao gồm hai bảng: bảng

Package
và bảng
TrackingEntry
. Bảng 5.4 và 5.5 mô tả các cột và kiểu dữ liệu tương ứng. Cấu trúc bảng Package

Cấu trúc của bảng TrackingEntry

Listing 5.3 Tạo bảng Package TrackingEntry

public static void CreateTrackingDatabase() { 
    string connstr = @"Data Source=My DocumentsPTSystem.sdf"; 
using(SqlCeConnection conn = new SqlCeConnection(connstr)) {
    conn.Open(); 
    // Create an the package table string ddlPackage =
    "CREATE TABLE Package( " +
    "ID int not null identity(1,1) PRIMARY KEY, " + "Code nvarchar(12) not null,
    " + "DestinationID nvarchar(12) not null)"; RunDDLCommand(conn, ddlPackage); 
    // Create the tracking entry table string ddlTrackingEntry =
    "CREATE TABLE TrackingEntry( " + 
    "ID int not null identity(1,1), " + "PackageID int not null, 
    " + "LocationID nvarchar(12) not null,
    " + "ArrivalTime datetime not null,
    " + "DepartureTime datetime null, " +
    "FOREIGN KEY (PackageID) REFERENCES Package(ID) )";
    RunDDLCommand(conn, ddlTrackingEntry);
   // Create an index on the tracking entry table
   string ddlArrivalTimeNdx =
   "CREATE INDEX ArrivalTime ON TrackingEntry(ArrivalTime )";
    RunDDLCommand(conn, ddlArrivalTimeNdx );
}
}

Phương thức bắt đầu để tạo một kết nối tới CSDL SQL Server là đối tượng SqlCeConnection. Đối tượng thể hiện được tạo bằng cách sử dụng chuỗi kết nối truy cập vào CSDL. Tiếp theo kết nối tới CSDL được mở bằng cách gọi phương thức: SqlCeConnection.Open. Chúng ta tạo bảng Package. Sử dụng chuỗi câu lệnh SQL để tạo bảng. Tạo bảng TrackingEntry. Bảng này chứa khóa ngoại ràng buộc trên cột PackageID. Giá trị trèn vào cột PackageID phải tồn tại trong cột ID của bảng Package.

Phương thức RunDDLCommand tạo các yếu tố khác nhau của CSDL.

Listing 5.4 Phương thức thực thi RunDDLCommand

public static void
    RunDDLCommand(SqlCeConnection conn, string ddlCmdStr) {
    SqlCeCommand cmdDDL = null; 
try {
    cmdDDL = new SqlCeCommand(ddlCmdStr, conn);
cmdDDL.CommandType = CommandType.Text;
    cmdDDL.ExecuteNonQuery();
    } catch(SqlCeException scee) {
    for(int curExNdx = 0; curExNdx < scee.Errors.Count; ++curExNdx)
 { MessageBox.Show("Error:"+scee.Errors[curExNdx].ToString()+"
");
    }
    } finally {
    if( cmdDDL != null )
    cmdDDL.Dispose();
}
}
The CommandType Enumeration Values

Một CSDL SQL Server CE có thể được quản lý bằng các câu lệnh quản lý dữ liệu SQL. SQL Server CE 2.0 hỗ trợ tập con các câu lệnh quản lý dữ liệu của SQL Server. Các câu lệnh hỗ trợ được liệt kê trong bảng 5.7

Câu lệnh DML hỗ trợ bởi SQL Server CE

SQL Server CE Query Analyzer có thể sử dụng các câu lệnh DML. Lớp

SqlCeCommand
có thể sử dụng thực thi trong lập trình thông qua SQL Server CE Data Provider.

Để quản lý CSDL SQL Sever CE, chúng ta có thể chạy các câu lệnh INSERT. Các bước như sau:

Bước 1: Mở một kết nối CSDL SQL Server CE sử dụgng thể hiện của lớp

SqlCeConnection
.

Bước 2: Tạo đối tượng

SqlCeCommand
, và đưa chuỗi câu lệnh
INSERT
.

Bước 3: Thiết lập kiểu câu lệnh, thực thi câu lênh bằng cách sử dụng phương thức

ExecuteNonQuery
.

Listing 5.5 t ả cách trèn dữ l i ệu vào bảng

Package
.
public static void 
    InsertNewPackage(string pckgCode, string destID) {
    String connstr = @"Data Source=My DocumentsPTSystem.sdf";
    using(SqlCeConnection conn = new SqlCeConnection(connStr)) {
    conn.Open();
    string dmlInsertPackage =
    "INSERT INTO Package(Code, DestinationID) " 
    + "VALUES ('" + pckgCode + "', '" + destID + "')";
    SqlCeCommand cmdInsertPackage =
    new SqlCeCommand(conn, dmlInsertPackage); 
try {
    cmdInsertPackage = new SqlCeCommand(conn , dmlInsertPackage); 
    cmdInsertPackage.CommandType = CommandType.Text; 
    cmdInsertPackage.ExecuteNonQuery();
    } catch(SqlCeException scee) {
    for(int curNdx=0; curNdx<scee.Errors.Count; ++curNdx)
 { MessageBox.Show("Error:"+scee.Errors[curNdx].ToString()+"
");
    }
    } finally { 
if(cmdInsertPackage != null)
    cmdInsertPackage.Dispose();
}
    }
    
}

Lấy dữ liệu bằng SqlCeDataReader

Dữ liệu có thể được lấy CSDL SQL CE bằng cách sử dụng lớp

SqlCeDataReader
. Lớp
SqlCeDataReader
cung cấp truy nhập nhanh, chỉ một hướng về phía trước tới các bản ghi dữ liệu.

Các bước để nhận dữ liệu bằng

SqlCeDataReader
như sau:

ơc1: Tạo một thể hiện

SqlCeConnection. SqlCeDataReader
sẽ sử dụng kết nối để nhận dòng dữ liệu yêu cầu.

c 2: Đối tượng

 SqlCeCommand
sẽ được tạo cùng vi câu lệnh
SELECT
thích hợp.

c 3: Thiết lập kiểu câu lệnh, và gọi phương thức

SqlCeCommand.ExecuteReader
. Phương thức
ExecuteReader 
thực thi command text đối với CSDL bằng
SqlCeConnection
.
SqlCeDataReader 
sẽ cung cấp truy cập dữ liệu để trả về dữ liệu được trả về.

SqlCeConnection 
sẽ bận will
SqlCeDataReader
đến khi quá trình đọc dữ liệu đóng lại.

Phương thức đưa đến một tham số của kiểu

CommandBehavio
r. Kiểu
CommandBehavior 
là một tập hợp mà
SqlCeCommand 
sử dụng. Bảng 5.8 là danh sách giá trị của
CommandBehavior 
bà mô tả. Giá trị CommandBehavior

Một

SqlCeDataReader
được trả về dựa vào gọi
ExecuteReader
. Sự tiến bộ của phương thức là đọc các bản ghi tiếp theo.
SqlCeDataReader
có vị trí khởi tạo là trước bảng ghi đầu tiền.

Vì vậy phải gọi

Read
trước khi yêu cầu lấy dữ liệu. Phương thức
Read
sẽ trả về true đến tận khi
SqlCeDataReader
đến cuối của tập kết quả trả về. Sau đó tả về kết quả false.

Chúng xác định được vị trí dòng dữ liệu, chúng ta có thể sử dụng các phương thức

GetXXX 
của
SqlCeDataReader
để truy nhạp các cột trong mỗi dòng dữ liệu. Phương thức
GetInt32
nhận một giá trị
Int32
từ một cột trong dòng hiện tại của
SqlCeDataReader
. Phương thức đưa đến một tham số kiểu
int
. Tham số này thể hiện số thứ tự của cột. Nếu thứ tự của cột không biết đến khi tiết kế, chúng ta có thể sử dụng phương thức
GetOrdinal
để tìm số thứ tự của cột bằng tên cột. Trong Listing 5.6 mô tả cách nhận tất cả thông tin từ bảng
Package
.

Listing 5.6 Nhận t ất cả thông tin trong bảng

Package
public static void GetAllPackageInfo() {
    string pckgStr =
    "Package Data
ID: {0}
Code: {1}
Destination: {2}";
    string connstr = @"Data Source=My DocumentsPTSystem.sdf";
    using(SqlCeConnection conn = new SqlCeConnection(connstr)) {
    conn.Open();
    string dmlPackageInfo = "SELECT * FROM Package"; 
    SqlCeCommand cmdGetPackageInfo = null; 
    SqlCeDataReader drPackageInfo = null;
    try {
    cmdGetPackageInfo = new SqlCeCommand(dmlPackageInfo, conn);
 cmdGetPackageInfo.CommandType = CommandType.Text; drPackageInfo =
    cmdGetPackageInfo.ExecuteReader(CommandBehavior.Default);
    while(drPackageInfo.Read()) { System.Windows.Forms.MessageBox.Show(
    string.Format(pckgStr, drPackageInfo.GetInt32(0),
    drPackageInfo.GetString(1),
drPackageInfo.GetString(2)));
    }
} catch(SqlCeException scee) {
    for(int curExNdx = 0; curExNdx < scee.Errors.Count; ++curExNdx) 
{ System.Windows.Forms.MessageBox.Show(
    "Error:"+ scee.Errors[curExNdx].ToString()+"
");
}
    } finally {
               if( cmdGetPackageInfo != null )
    cmdGetPackageInfo.Dispose();
if( drPackageInfo != null )
drPackageInfo.Close();
}
}
}

Sử dụng tham số SQL Commands

Câu lệnh

SELECT
sử dụng trong Listing 5.5 rất đơn giản. Trong các câu lệnh
SELECT
sẽ hầy hết sử dụng mệnh đề
WHERE
, cái đó sẽ giúp chúng ta lấy những dòng cần thiết. Chúng ta có thể sử dụng mệnh đề
WHERE
để lựa chọn thông tin trong bảng
Package
. Một ví dụ về truy
SELECT
:
SELECT * FROM Package WHERE ID = "0987654321"
    

Truy vấn này

SELECT
lấy về những dòng có cột
ID
có giá trị 0987654321.

Chúng ta hãy tạo một đối tượng

SqlCeCommand
. Đối tượng
SqlCeCommand
cung cấp thuộc tính
Parameters 
chứa đựng tập hợp tất cả các tham số. Để thêm tham số vào tập hợp này chúng ta sử dụng phương thức
SqlCeCommand.Prepare
.

Listing 5.7 Thực thi m ột tham số SQL command

public static void GetPackageInfo(int pckgID) {
    string pckgStr =
    "Package Data
ID: {0}
Code: {1}
Destination: {2}";
    string connstr = @"Data Source=My DocumentsPTSystem.sdf";
    using(SqlCeConnection conn = new SqlCeConnection(connstr)) {
    conn.Open();
    string dmlPackageInfo = "SELECT * FROM Package WHERE ID = ?";
    SqlCeCommand cmdGetPackageInfo = null;
    SqlCeDataReader drPackageInfo = null;
try {
    cmdGetPackageInfo = new SqlCeCommand(dmlPackageInfo, conn); 
    cmdGetPackageInfo.CommandType = CommandType.Text;
    cmdGetPackageInfo.Parameters.Add("ID", pckgID);
    cmdGetPackageInfo.Prepare();
    drPackageInfo =
    cmdGetPackageInfo.ExecuteReader(CommandBehavior.SingleRow);
    while(drPackageInfo.Read()) { System.Windows.Forms.MessageBox.Show(
    string.Format(pckgStr, drPackageInfo.GetInt32(0), 
    drPackageInfo.GetString(1),
    drPackageInfo.GetString(2)));
    }
} catch(SqlCeException scee) {
    for(int curExNdx = 0; curExNdx < scee.Errors.Count; ++curExNdx) 
    { System.Windows.Forms.MessageBox.Show(
    "Error:"+ scee.Errors[curExNdx].ToString()+"
");

}
} finally {
if( cmdGetPackageInfo != null )
cmdGetPackageInfo.Dispose(); 
if( drPackageInfo != null )
drPackageInfo.Close();
}
}
}

Truy vấn có tham số có thể được sử dụng trong hầu hết các câu SQL, DDL và DML. Nó có thể được sử dụng nhiều hơn một tham số trong truy vấn. Ví dụ, truy vấn sau có thể được sử dụng để

SELECT
.
SELECT * FROM Package WHERE Code = ? OR DestinationID = ?
    

Khi sử dụng câu lệnh

SELECT
cùng với nhiều tham số, chúng ta phải thêm đối tượng
SqlCeParameters 
vào tập hợp
Parameters
theo thứ tự dấu ? xuất hiện từ trái sang phải.

Listing 5.8 Thực thi SQL command cùng với nhiều tham số

public static void GetPackageInfo(int[] pckgID) {
    string pckgStr =
    "Package Data
ID: {0}
Code: {1}
Destination: {2}";
    string connstr = @"Data Source=My DocumentsPTSystem.sdf";
    using(SqlCeConnection conn = new SqlCeConnection(connstr)) {
    conn.Open();
    string dmlPackageInfo = "SELECT * FROM Package WHERE ID = ?";
    SqlCeCommand cmdGetPackageInfo = null;
    SqlCeDataReader drPackageInfo = null;
try {
    cmdGetPackageInfo = new SqlCeCommand(dmlPackageInfo, conn);
    cmdGetPackageInfo.CommandType = CommandType.Text;
    cmdGetPackageInfo.Parameters.Add("ID", SqlDbType.Int);
    cmdGetPackageInfo.Prepare();
    for(int pckgNdx = 0; pckgNdx < pckgID.Length; ++pckgNdx)
  { cmdGetPackageInfo.Parameters[0].Value = pckgID[pckgNdx]; try {
    drPackageInfo =
    cmdGetPackageInfo.ExecuteReader(CommandBehavior.SingleRow);
    while(drPackageInfo.Read()) { System.Windows.Forms.MessageBox.Show(
    string.Format(pckgStr, drPackageInfo.GetInt32(0), 
    drPackageInfo.GetString(1),drPackageInfo.GetString(2)));
    }
} catch(SqlCeException scee) {}
for(int curExNdx=0;curExNdx<scee.Errors.Count;++curExNdx) {
System.Windows.Forms.MessageBox.Show(
"Error:"+ scee.Errors[curExNdx].ToString()+"
");
}
} finally {
if( drPackageInfo != null )
drPackageInfo.Close();}
}
} finally {
if( cmdGetPackageInfo != null )
cmdGetPackageInfo.Dispose();
}
}
}

Compact Framework cung cấp khả năng lập dữ liệu trực tiếp từ SQL Server CE vào một

DataSet
. Điều này được hoàn thành bằng cách sử dụng
SqlCeDataAdapter
đưa vào
DataSet. SqlCeDataAdapter
có thể đưa vào
DataSet
và cập nhật vào CSDL.
DataSet
có thể quản lý tất cả các giao tiếp giữa ứng dụng và CSDL SQL Server CE .

Quản lý

SqlCeDataAdapter
trong CSDL bằng cách chạy các câu lệnh khác nhau. Có bốn câu lệnh được đưa ra như là thuộc tính trên
SqlCeDataAdapter
, đó là
SelectCommand
,
InsertCommand, UpdateCommand,
DeleteCommand
.

Thuộc tính

SelectCommand
là đối tượng
SqlCeCommand
xác định là câu lệnh SQL mà S
qlCeDataAdapter
sẽ sử dụng để nhậ dữ liệu từ CSDL SQL Server CE database.
SqlCeDataAdapter 
sẽ sử dụng dữ liệu để đưa vào
DataSet
.

Bao gồm các bước sau:

c 1: Xây dựng một

DataSet

c 2: Nhận dữ liệu

c 3: Đưa vào

DataSet

Trước tiên,

SqlCeDataAdapter
khởi tạo giản đồ DataSet tương ứng với giản đồ trong nguồn dữ liệu, Điều này có nghĩa là
DataTables
được xây dựng tương ứng với bảng CSDL nguồn như là xây dựng
DataColumns tương ứng với cột bảng CSDL nguồn. Quan hệ giữa DataSet và CSDL ngu
ồn được biết như là ánh xạ bởi vì chúng ánh xạ đối tượng
DataSet
vào đối tượng CSDL. Tiếp theo dữ liệu được nhận về từ CSDL nguồn bằng cách sử dụng thuộc tính
SelectCommand.
Cuối cùng
DataRows 
được tạo để nhận dữ liệu, và các dòng được trèn vào
DataTables
.

Sau đây là đoạn mã đưa dữ liệu vào một

DataSet
bằng cách sử dụng
SqlCeDataAdapter 
rất đơn giản. Listing 5.9 mô tả cách đưa dữ liệu của bảng
Package
vào
DataSet 
bằng cách sử dụng
SqlCeDataAdapter
.

Listing 5.9 Đ ưa dữ l i ệu vào DataSet cùng với nội dung của bảng Package

public static DataSet GetPackageDataSet() { 
    string connstr = @"Data Source=My DocumentsPTSystem.sdf"; 
    using(SqlCeConnection conn = new SqlCeConnection(connstr)) {
    conn.Open(); 
    string dmlPackageInfo = "SELECT * FROM Package";
    SqlCeDataAdapter daPackages = new SqlCeDataAdapter();
    daPackages.MissingMappingAction = MissingMappingAction.Passthrough;
    daPackages.MissingSchemaAction = MissingSchemaAction.Add; 
    daPackages.SelectCommand = new SqlCeCommand(dmlPackageInfo, conn); 
    DataSet dsPackages = new DataSet();
    daPackages.Fill(dsPackages); 
    return dsPackages;
}

Trước tiên tạo và mở một kết nối tới CSDL SQL Server CE. Sau đó tạo một đối tượng

SqlCeDataAdapter
và thiết lập
MissingMappingAction
và thuộc tính
MissingSchemaAction
. Thiết lập thuộc tính mặc định. Tiếp theo, thiết lập
SelectCommand
thành một đối tượng
SelectCommand
lựa chọn tất cả dữ liệu từ bảng
Package
. Cuối cùng, tạo đối tượng
DataSet
và gọi phương thức
SqlCeDataAdapter.Fill
để đưa dữ liệu vào DataSet với dữ liệu trong bảng
Package.

DataSet
đã đưa dữ liệu vào bằng cách sử dụng
SqlCeDataAdapter
, chúng ta có thể tạo sự thay đổi dữ liệu và cập nhật dữ liệu nguồn, chúng ta phải chỉ ra ba thuộc tính thêm vào đối tượng
SqlCommand 
cho
SqlCeDataAdapter 
là:
UpdateCommand,
InsertCommand
, và
DeleteCommand.

Listing 5.11 Sử dụng

SqlCeDataAdapter
để cập nhật dữ l i ệu
public static
    SqlCeDataAdapter GetPackageDataAdapter(SqlCeConnection conn){
    string dmlPackageInfo = "SELECT * FROM Package";
    string dmlUpdatePackage="UPDATE Package " +
"SET CODE = ?, " +
"	DestinationID = ? " + "WHERE ID = ?";
string dmlInsertPackage="INSERT INTO " +
"Package(Code, DestinationID) " +
"VALUES (?, ?)";
string dmlDeletePackage="DELETE FROM " + "Package " + "WHERE ID = ?";
SqlCeDataAdapter daPackages = new SqlCeDataAdapter();
daPackages.SelectCommand = new SqlCeCommand(dmlPackageInfo, conn);
daPackages.UpdateCommand = new SqlCeCommand(dmlUpdatePackage, conn);
daPackages.UpdateCommand.Parameters.Add("Code", SqlDbType.NVarChar); 
daPackages.UpdateCommand.Parameters.Add("DestinationID",
SqlDbType.NVarChar);
daPackages.UpdateCommand.Parameters.Add("ID", SqlDbType.Int);
daPackages.InsertCommand = new SqlCeCommand(dmlInsertPackage, conn);
daPackages.InsertCommand.Parameters.Add("Code", SqlDbType.NVarChar);
daPackages.InsertCommand.Parameters.Add("DestinationID",
SqlDbType.NVarChar);
daPackages.DeleteCommand = new SqlCeCommand(dmlDeletePackage, conn);
daPackages.DeleteCommand.Parameters.Add("ID", SqlDbType.Int);
return daPackages;
}

SqlCeDataAdapter
cập nhật dữ liệu nguồn khi chúng ta gọi phương thức
Update
.

Phương thức

 Update
thao tác qua 5 bước khi cập nhật dữ liệu:

c1: Các giá trị cập nhật được nạp vào từ đối tượng

DataRow
trong tham số câu lệnh có liên quan.

c 2: Sự kiện

RowUpdating
được đưa ra.

c 3: Câu lệnh liên quan được thực thi đối với dữ liệu nguồn.

c 4: Sự kiện

RowUpdated
được đưa ra.

Bước 5: Thuộc tính

RowSet
của
DataRow
được thiết lập lại
RowState.Unchanged
bằng cách gọi phương thức
AcceptChanges
.

Listing 5.12 Cập nhật b ảng

Package
sử dụng
SqlDataAdapter
public static void UpdatePackageTable(DataSet dsPackages) {
    string connstr = @"Data Source=My DocumentsPTSystem.sdf";
    using(SqlCeConnection conn = new SqlCeConnection(connstr)) {
    conn.Open();
SqlCeDataAdapter daPackages = GetPackageDataAdapter(conn);
daPackages.Update(dsPackages);
}
}

Thao tác với sự kiện c p nhật

SqlCeDataAdapter

Khi chúng ta gọi phương thức cập nhật trên

SqlCeDataAdapter,
có hai sự kiện được đưa ra. Sự kiện
RowUpdating
được đưa ra trước câu lệnh
Update
được thực thi với dữ liệu nguồn. Sự kiện
RowUpdated
được phát sinh sau khi câu lệnh
Update
được thực thi với dữ liệu nguồn.

Khi chúng ta nhận một sự kiện

RowUpdating
, chúng ta sẽ xác định thuộc tính của đối tượng
SqlCeRowUpdatingEventArgs
và quyết định tiếp tục cập nhật hay không.

Trước tiên, chúng ta cần khởi tạo

SqlCeDataAdapter
và thuộc tính
SelectCommand.
Sau đó chúng ta tạo
SqlCeCommandBuilder
thông qua
SqlCeDataAdapter
như là tham số để cấu trúc
SqlCeCommandBuilder
.
SqlCeCommandBuilder
sẽ tạo một câu lệnh cho thuộc tính
UpdateCommand
,
InsertCommand
, and
DeleteCommand 
của
SqlCeDataAdapter
. Listing5.14 mô tả cách sử dụng
SqlCeCommandBuilder
để xây dựng một
SqlCeDataAdapter
cho bảng
Package.

Listing 5.14 Sử dụng

SqlCeCommandBuilder
public static
    SqlCeDataAdapter GetPackageDataAdapter(SqlCeConnection conn)
{ string dmlPackageInfo = "SELECT * FROM Package"; 
SqlCeDataAdapter daPackages = new SqlCeDataAdapter();
    daPackages.SelectCommand = new SqlCeCommand(dmlPackageInfo, conn);
    SqlCeCommandBuilder cmdBldr = new SqlCeCommandBuilder(daPackages);
 MessageBox.Show(cmdBldr.GetUpdateCommand().CommandText);
 MessageBox.Show(cmdBldr.GetInsertCommand().CommandText);
 MessageBox.Show(cmdBldr.GetDeleteCommand().CommandText);
    return daPackages;
}
0