Mục lục
Tóm tắt 1
Chương 1: Mở đầu 3
Chương 2: Tổng quan công nghệ 4
2.1. Tổng quan về hệ điều hành Window CE 4
2.2. Một số thiết bị cầm tay phổ biến 5
2.2.1. Ưu nhược điểm của thiết bị cầm tay 9
Chương 3: Tình hình ứng dụng công nghệ thông tin hiện nay ngành Hải quan 11
3.1. Khái quát trình và công tác ứng dụng công nghệ thông tin Hải Quan 11
3.1.1. Hạ tầng CNTT 11
3.1.2. Ứng dụng công nghệ thông tin trong các nghành hải quan 12
3.2. Mục tiêu và định hướng phát triển 12
3.3. Những tồn đọng trong việc ứng dụng CNTT vào ngành Hải quan 14
Chương 4: Cơ sở lý thuyết xây dựng cơ sở dữ liệu trên Windows CE 16
4.1. Cấu trúc của Cơ sở dữ liệu Windows CE 16
4.2. Tạo và xoá cơ sở dữ liệu 20
4.3. Liệt kê cơ sở dữ liệu 22
4.4. Mở cơ sở dữ liệu 23
4.5. Sắp xếp cơ sở dữ liệu 25
4.6. Tìm kiếm các bản ghi 27
4.7. Đọc bản ghi 29
4.8. Viết các bản ghi 31
4.9. Xoá bản ghi 33
4.10. Lấy về các thông tin của các đối tượng lưu trữ 33
4.11. Thay đổi thông tin của DB(database) 37
4.12. Handling Database Notification Messages 38
4.13. DB giao tiếp 40
4.15 Thẻ địa chỉ 41
4.16. Mở DB Contacts 43
4.17. Truy cập tới các thẻ địa chỉ 43
4.18. Thêm mới hoặc thay đổi thẻ địa chỉ 46
Chương 5: Thiết kế hệ thống 47
5.1. Mô tả bài toán 47
5.2 Sơ đồ phân rã chức năng 51
5.3 Biểu đồ luồng dữ liệu 52
5.4 Thiết kế giao diện 53
Chương 6: Kết quả 54
6.1. Các chức năng chính của hệ thống đạt được 54
6.1.1. Giao diện cơ sở dữ liệu của hệ thống do WinCE quản lý 54
6.1.2. Giao diện trước khi tìm kiếm thuế 55
6.1.3. Giao diện sau khi tìm kiếm thuế 56
6.2. Đánh giá kết quả đạt được 56
Chương 7: Kết luận 57
Tài liệu tham khảo 58
58 trang |
Chia sẻ: lethao | Lượt xem: 1876 | Lượt tải: 2
Bạn đang xem trước 20 trang tài liệu Khóa luận Tìm hiểu về hệ điều hành dành cho các thiết bị cầm tay - hệ điều hành Windows CE, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
ồm một số bản ghi. Và mỗi bản ghi lại bao gồm một hoặc nhiều thuộc tính.
Hình 5: Sơ đồ cấu trúc phân cấp của Windows CE database
Ví dụ, một ứng dụng có thể lưu trữ một cơ sở dữ liệu của các bản ghi địa chỉ, mỗi bản ghi bao gồm có tên, địa chỉ , số điện thoại v.v..
Mỗi một cơ sở dữ liệu bao gồm thông tin về cơ sở dữ liệu như tên cơ sở dữ liệu, đó là tên kiểu cơ sở dữ liệu được chọn mà được dùng vào một nhóm cơ sở dữ liệu. Tên của cơ sở dữ liệu rất quan trọng vì tất cả các cơ sở dữ liệu dung chung một tên miền đơn.
Bổ sung vào tên của cơ sở dữ liệu, hệ thống cơ sở dữ liệu lưu trữ khoá sắp xếp cho mỗi cơ sở dữ liệu. Khi một cơ sở dữ liệu được tạo ra, có tới bốn kiểu khoá sắp xếp có thể được chỉ định, chỉ ra cách mà các bản ghi được lưu trữ trong cơ sở dữ liệu. Với dữ liệu được đưa vào cơ sở dữ liệu, hệ thống sử dụng các khoá mặc định để định vị các bản ghi một cách tự động.
Cơ sở dữ liệu Windows CE có thể chỉ có một mức, vì vậy mà các bản ghi không thể chứa các bản ghi khác, và không thể chứa nhiều hơn một cơ sở dữ liệu. Kích thước tối đa của một bản ghi là 128K và kích thước tối đa của một thuộc tính là 64K. Như vây, chỉ có 32 bytes đối với một bản ghi và 4 bytes đối với một thuộc tính. Và tất cả các chuỗi trong cơ sở dữ liệu của Windows CE đều được lưu dưới dạng Unicode.
Thực tế thì cơ sở dữ liệu của một chương trình có thể bị thay đổi bởi một chương trình khác. Một ứng dụng không thể khoá cơ sở dữ liệu để hạn chế việc truy cập và hệ điều hành không đảm bảo tính toàn vẹn cho các bản ghi cơ sở dữ liệu( ví dụ nhiều ứng dụng xoá các bản ghi cùng một lúc). Nhưng các chương trình cũng có thể đưa ra thông báo khi một cơ sở dữ liệu bị thay đổi do Windows CE hỗ trợ một vài thông báo để thông báo khi một ứng dụng khác tạo, chỉnh sửa hay xoá bản ghi trong cơ sở dữ liệu.
Windows CE thực thi nhiều hàm quản lý trên cơ sở dữ liệu như là việc nén dữ liệu khi dữ liệu được chèn vào hoặc giải nén dữ liệu khi dữ liệu được truy cập, và đảm bảo tính toàn vẹn của các bản ghi trong cơ sở dữ liệu. Thêm vào đó, Windows CE hỗ trợ kỹ thuật làm cho việc đồng bộ hoá cơ sở dữ liệu giữa desktop computer và Windows CE trở nên dễ dàng.
Các chương trình tạo và sử dụng một cơ sở dữ liệu Windows CE thông qua hàm API Windows CE mới. Sau đây là bảng danh sách các hàm chức năng cơ sở dữ liệu và các hàm API tương ứng.
Database Operation
Windows CE Functions
Create database
PegCreateDatabase
Delete database
PegDeleteDatabase
Enumerate databases
PegFindFirstDatabase,
PegFindNextDatabase
Opendatabase
PegOpenDatabase
Seekrecord
PegSeekDatabase
Read record
PegReadRecordProps
Write record
PegWriteRecordProps
Retrieve object Information
PegOidGetInfo
Set database Information
PegSetDatabaseInfo
Bản ghi và thuộc tính của cơ sở dữ liệu:
Các bản ghi và các thuộc tính theo các khối đã được tạo sẵn để xây dựng cơ sở dữ liệu Windows CE . Một cơ sở dữ liệu được bao gồm một số bản ghi, và mỗi bản ghi được bao gồm một hoặc nhiều thuộc tính.
Tất cả các bản ghi trong cơ sở dữ liệu Windows CE được xác định bởi một cái tên duy nhất. Cái tên định danh này được gán bởi hệ thống khi một bản ghi mới được tạo ra. Tuy một chương trình không cần phải theo dõi tên của bản ghi, tên của bản ghi có thể được tìm kiếm trong cơ sở dữ liệu. Từ định danh bản ghi thuộc loại PEGOID.
Mỗi thuộc tính của bản ghi lại bao gồm có tên thuộc tính, loại dữ liệu, giá trị. Tên và loại dữ liệu của thuộc tính được kết hợp làm một loại dữ liệu thuộc loại PEGPROPID có hai phần với giá trị là hai từ. Từ ở vị trí cao là tên, từ ở vị trí thấp là kiểu dữ liệu. Windows CE hỗ trợ các kiểu dữ liệu là kiểu integer, kiểu string, kiểu time, kiểu mảng (array). Bảng dưới đây cung cấp các kiểu dữ liệu
Bảng các kiểu dữ liệu constant
Kiểu của thuộc tính
Kiểu dữ liệu
PEGVT_BLOB
Là một structure PEGBLOB
PEGVT_FILETIME
Là một structure FILETIME
PEGVT_12
Là một số nguyên có dấu 16 bit
PEGVT_I4
Là một số nguyên có dấu 32 bit
PEGVT_LPWSTR
Một chuỗi kết thúc với giá trị null
PEGVT_UI2
Một số nguyên không dấu 16 bit
PEGVT_UI4
Một số nguyên không dấu 32 bit
Các bản ghi được trình bày như cấu trúc PEGPROPVAL định nghĩa các thuộc tính của bản ghi. Cấu trúc PEGPROPVAL được định nghĩa như sau:
typedef struct _PEGPROPVAL{
PEGPROPID proid;
WORD wLenData;
WORD sFlags;
PEGVALUNION val;
} PEGPROPVAL;
Cấu trúc PEGPROPVAL có các thành phần sau:
PEGPROPVAL propid: chỉ ra giá trị của thuộc tính- trường tại phần từ cao là giá trị đã được chương trình định nghĩa, còn phần từ thấp là từ PEGVT_ chỉ ra kiểu của dữ liệu.
WORD wLenData: hiện tại thuộc tính này không được sử dụng
WORD wFlag: Cờ được thiết lập bởi một chương trình cho PEGDB_PROPDELETE để xác định thuộc tính bị xoá, hoặc thuộc tính được thiết lập bởi hệ thống cho PEGDB_PROPNOTFOUND khi cập nhật bản ghi tại nơi mà thuộc tính không được xác định.
PEGVALUNION val: Chỉ ra giá trị thực cho các kiểu dữ liệu đơn, hoặc trỏ đến các string hoặc BLOBs.
Structure PEGPROPVAL được sử dụng cả khi đọc và khi viết bản ghi. Khi đọc, ví dụ chương trình có thể sử dụng hàm TypeFromPropID để xác định để xác định kiểu thuộc tính được cấp cho tên của thuộc tính( PEGPROPID).
4.2. Tạo và xoá cơ sở dữ liệu
Một chương trình có thể tạo và xoá cơ sở dữ liệu khi cần thiết. Số lượng cơ sở dữ liệu có thể tồn tại phụ thuộc vào bộ nhớ ( khoảng trống lưu trữ) trên thiết bị. Cơ sở dữ liệu của Windows CE được tạo bởi hàm PegCreateDatabase. Đối số của hàm là tên cơ sở dữ liệu và kiểu tên của cơ sở dữ liệu và xác định kiểu sắp xếp tuỳ ý. Kiểu sắp xếp được xác định bằng một chỉ số chỉ kiểu sắp xếp trong sơ sở dữ liệu. Đối số này có thể bằng không nếu không thực hiện sắp xếp. Bảng dưới đây tổng kết các đối số của hàm PegCreateDatabase
Thống kê các đối số của hàm PegCreateDatabase
Các đối của hàm PegCreateDatabase
Miêu tả
LPWSTR lpszName
Tên của cơ sở dữ liệu với tối đa là 32 ký tự.
DWORD dwDbaseType
Loại cơ sở dữ liệu đã định nghĩa bởi chương trình.
WORD wNumSortOrder
Con số của kiểu sắp xếp trong mảng rgSortSpecs. Một cơ sở dữ liệu có thể có từ 0 tới 4 kiểu sắp xếp.
SORTORDERSPEC * rgSortSpecs
Con trỏ trỏ tới mảng của kiểu sắp xếp hoặc bằng NULL nếu là wNumSortOrder.
Nếu hàm PegCreateDatabase thành công, nó trả về giá trị là tên của cơ sở dữ liệu. Tên của cơ sở dữ liệu dùng để mở cơ sở dữ liệu mục đích chính là để thao tác với nội dung của nó. Nếu không thành công trả về giá trị NULL. Hàm GetLastError có thể được sử dụng để lấy mã của lỗi. Bảng sau trình bày mã lỗi
Thống kê mã lỗi
Mã lỗi
Miêu tả
ERROR_DISK_FULL
Lỗi không đủ bộ nhớ để tao dữ liệu
ERROR_INVALID_PARAMETER
Lỗi một đối số không có giá trị
ERROR_DUP_NAME
Lỗi tên cơ sở dữ liệu mới trùng tên với cơ sở dữ liệu đã tồn tại
Hàm PegDeleteDatabase được dùng để huỷ một cơ sở dữ liệu . Một đối duy nhất - PEGOID là tên của cơ sở dữ liệu bị xoá. Nếu hàm thực hiện thành công thì giá trị trả về là TRUE, ngược lại không thành công thì giá trị trả về là FALSE. Sử dụng hàm GetLastError để lấy về thông tin của các lỗi đó. Mã lỗi có thể là ERROR_INVALID_PARAMETER, nghĩa là đối không có giá trị hoặc là ERROR_SHARING_VIOLATION nghĩa là một chương trình khác đang sử dụng cơ sở dữ liệu mà chương trình muốn xoá.
4.3. Liệt kê cơ sở dữ liệu
Mỗi một đối tượng lưu trữ có một số lượng cơ sở dữ liệu tuỳ ý. Các hàm PegFindFirstDatabase và PegFindNextDatabase cho phép chương trình liệt kê cơ sở dữ liệu có trong đối tượng lưu trữ.
Hàm PegFindFirstDatabase bắt đầu liệt kê theo trình tự và trả về bảng liệt kê theo hàm PegFindNextDatabase. Khi liệt kê hết cơ sở dữ liệu hàm PegFindNextDatabase sẽ trả về lỗi ERROR_NO_MORE_ITEM.
Chỉ có một đối duy nhất cho hàm PegFindFirstDatabase là DWORD, là kiểu tên cơ sở dữ liệu được chương trình định nghĩa mà nó có thể được sử dụng khi tạo cơ sở dữ liệu mới. Chỉ đinh là zero cho kiểu tên cơ sở dữ liệu liệt kê tất cả các cơ sở dữ liệu trong đối tượng lưu trữ. Giá trị trả về là một trình điều khiển ngữ cảnh bảng liệt kê hoặc ERROR_HANDLE_INVALID nếu hàm thực hiện không thành công. Gọi hàm GetLastError có thể trả về ERROR_OUTOFMEMORY cho biết không đủ bộ nhớ để cấp phát cho điều khiển cơ sở dữ liệu.
Chỉ có một đối số duy nhất cho hàm PegFindNextDatabase là HANDLE, đối số này nhận biết ngữ cảnh của bảng liệt kê. Nếu hàm thực hiện thành công thì giá trị trả về là tên của cơ sở dữ liệu tiếp theo được liệt kê. Nếu hàm thực hiện không thành công thì giá trị trả về là zero, sử dụng hàm GetLastError để có được nhiều thông tin về lỗi đó. Có thể là ERROR_NO_MORE_ITEM nghĩa là đối tượng lưu trữ không nhiều hơn một cơ sở dữ liệu hoặc ERROR_INVALID_PARAMETER nghĩa là việc điều khiển ngữ cảnh của bảng liệt kê là không có giá trị. Khi chương trình kết thúc liệt kê cơ sở dữ liệu thì cần phải đóng điều khiển đó lại bằng cách sử dụng hàm CloseHandle.
Dưới đây là một đoạn lệnh giải thích từng bước liệt kê cơ sở dữ liệu trong Windows CE:
HANDLE hEnumerator;
PEGOID objectID;
//Liệt kê tất cả các databases
hEnumerator = PegFindFirstDatabase(0);
if (hEnumerator == INVALID_HANDLE_VALUE)
{
::MessageBox(NULL, L"Invalid handle", L"Error", MB_OK);
return;
}
while( (objectID = PegFindNextDatabase(hEnumerator)) != 0)
{
// sử dụng objectID của database
...
}
CloseHandle(hEnumDB); // cần phải đóng ngữ cảnh bảng liệt kê
4.4. Mở cơ sở dữ liệu
Theo trình tự truy cập cơ sở dữ liệu của Windows CE, trước tiên một chương trình phải có được quyền thao tác trên cơ sở dữ liệu. Trong quá trình thao tác với cơ sở dữ liêu được sử dụng các hàm cơ sở dữ liệu API . Sử dụng hàm PegOpenDatabse để mở một cơ sở dữ liệu Windows CE.
Giá trị trả vể của hàm PegOpenDatabase là hành động mở cơ sở dữ liệu. Sau khi mở cơ sở dữ liệu thì có thể đọc hoặc sửa đổi cơ sở dữ liệu. Khi kết thúc việc sử dụng cơ sở dữ liệu cần phải đóng cơ sở dữ liệu bằng cách gọi hàm CloseHandle.
Cờ không bắt buộc với hàm PegOpenDatabase là PEGDB_AUTOINCREMENT. Cờ này điều khiển cho hệ thống tự động tăng con trỏ tìm kiếm sau tất cả các lần gọi hàm PegReadRecordProps. Con trỏ tìm kiếm này đánh dấu bản ghi được đọc tiếp theo. Các chương trình có thể đọc nhiều bản ghi cùng một lúc bằng cách kết hợp cơ PEGDB_AUTOINCREMENT với cờ PEGDB_AUTOINCREMENT.
Một đối số khác của hàm PegOpenDatabase là tên thuộc tính của thuộc tính được sử dụng như là kiểu sắp xếp cho hành động mở cơ sở dữ liệu. Hệ thống sử dụng kiểu sắp xếp này để xác định rõ nơi con trỏ tìm kiếm chuyển đến sau khi gọi hàm PegReadRecordProps (nếu cờ PEGDB_AUTOINCREMENT được chỉ định ). Kiểu sắp xếp cũng xác định được thuộc tính mà hàm PegSeekDatabase sử dụng để truyền cơ sở dữ liệu.
Bởi vì có thể có nhiều chương trình chạy trên cùng một cơ sở dữ liệu cùng một lúc, có thể một chương trình thay đổi cơ sở dữ liệu mà hiện tại một chương trình khác cũng đang chạy trên nó. Hệ điều hành có thể đưa ra thông báo khi các sự việc này xuất hiện. Để lấy về các thông báo đó, chương trình ghi rõ cửa sổ hoạt động trong hàm PegCreateDatabase. Sau đó Windows CE sẽ gửi thông báo
Thống kê các đối số của hàm PegOpenDatabase
Các đối số của hàm PegOpenDatabase
Miêu tả
PPEGOID poid
Trỏ tới từ định danh đối tượng của cơ sở dữ liệu được mở. Mở một cơ sở dữ liệu bằng tên , thiết lập giá trị của poid trỏ tới zero, tức là có thể lây được từ định danh đối tượng của cơ sở dữ liệu mới được mở khi tên của cơ sở dữ liệu được chỉ rõ cho lpszName.
LPWSTR lpszName
Trỏ tới tên của cơ sở dữ liệu được mở. Đối số nay được bỏ qua nếu giá trị của poid là khác zero
PEGPROPID propid
Chỉ rõ tên thuộc tính của khoá chính cho thứ tự sắp xếp trong quá trình duyệt toàn bộ dữ liệu. Sau khi gọi hàm PegSeekDatabase thì có được thứ tự sắp xếp này. Đối số này có thể bằng zero nếu thứ tự sắp xếp là không quan trọng.
DWORD dwFlags
Chỉ rõ cờ hoạt động là PEGDB_AUTOINCREMENT
hoặc là 0
HWND hwndNotify
Nhận dạng cửa sổ - window mà đưa ra thông báo (DB_PEGOID_*) được gửi nếu một chương trình khác thay đổi cơ sở dữ liệu mà chương trình của bạn đang thao tác trên cơ sở dữ liệu đó. Đối số này có thể nhân giá trị NULL nếu chương trình không cần nhân thông báo.
Nếu hàm PegOpenDatabase thực hiện thành công, giá trị trả về là việc điều khiển việc mở cơ sở dữ liệu. Nếu hàm thực hiện không thành công, giá trị trả về là INVALID_HANDLE_VALUE. Để có được nhiều thông tin hơn về lỗi, gọi hàm GetLastError. Dưới đây là bảng có danh sách các mã lỗi:
Danh sách các mã lỗi
Mã lỗi
Miêu tả
ERROR_INVALID_PARAMETER
Lỗi một đối số không có giá trị
ERROR_FILE_NOT_FOUND
Không có cơ sở dữ liệu tồn tại với tên được chỉ định. Lỗi này chỉ được sử dụng nếu giá trị của poid được đặt bằng NULL hoặc bằng zero khi hàm đã được gọi.
ERROR_NOT_ENOUGH_MEMORY
Lỗi không đủ bộ nhớ cấp phát để thao tác cơ sở dữ liệu.
4.5. Sắp xếp cơ sở dữ liệu
Một chương trình thường đặt các thông tin cùng loại trong tất cả các bản ghi trong cơ sở dữ liệu đã cho. Mỗi bản ghi trong chương trình TravelManager có thể có các thông tin về hãng hàng không, số chuyến bay, giờ khởi hành, giờ đến, số chỗ ngôi v.v... Thêm vào đó các thuộc tính cùng loại đối với mỗi bản ghi có thể được đặt trong cùng một tên thuộc tính( ví dụ như, tên thuộc tính cho thuộc tính số chuyến bay của một bản ghi có thể giống với tất cả các bản ghi khác trong cơ sở dữ liệu đó).
Khi tất cả các bản ghi trong cơ sở dữ liệu Windows CE dùng chung một tên thuộc tính, thì một chương trình có thể yêu cầu hệ thống sắp xếp các bản ghi dựa vào thuộc tính nhận được. Thứ tự trong các bản ghi đã được sắp xếp ảnh hưởng tới thứ tự mà hàm PegSeekDatabase tìm kiếm các bản ghi trong cơ sở dữ liệu, hoặc thứ tự bản ghi mà hệ thống tiến con trỏ tìm kiếm lên phía trước khi sử dụng cờ PEGDB_AUTOINCREMENT khi mở một cơ sở dữ liệu. Có tới 4 từ định danh thuộc tính khác nhau có thể được dùng để sắp xếp khi một cơ sở dữ liệu mới được tạo. Phần mô tả thứ tự sắp xếp đó được chỉ rõ với structure SORTORDERSPEC mà nó có chứa từ định danh của thuộc tính trên mỗi bản ghi cơ sở dữ liệu được lưu trữ. Structure này cũng chứa cả các cờ có liên quan tới thứ tự sắp xếp. SORTORDERSPEC được định nghĩa như sau:
typed ef struct _SORTORDERSPEC {
PEGPROPID propid;
DWORD dwFlags;
} SORTORDERSPEC;
Giá trị hợp lệ cho các cờ thành viên được liệt kê trong bảng sau:
Cờ
Ý nghĩa
PEGDB_SORT_DESCENDING
Việc sắp xếp được thực hiện theo thứ tự đi xuống. Mặc định sắp xếp theo thứ tự đi lên
PEGDB_SORT_CASEINSENSITIVE
Quá trình sắp xếp phân biệt dạng chữ. Giá trị này chỉ đúng trong trường hợp là string.
PEGDB_SORT_UNKNOWNFIRST
Các bản ghi không có thuộc tính này được đặt trước tất cả các bản ghi khác. Mặc định, nhiều bản ghi được đặt trước các bản ghi khác.
Một chương trình chỉ rõ thứ tự sắp xếp để sử dụng khi gọi hàm PegOpenDatabase để mở một điều khiển tới cơ sở dữ liệu. Chỉ có một thứ tự sắp xếp duy nhất có thể có hiệu lực cho một thao tác mở. Tuy nhiên, bằng việc mở nhiều điều khiển tới cùng một cơ sở dữ liệu, chương trình có thể sử dụng nhiều hơn một thứ tự sắp xếp.
Thứ tự sắp xếp của cơ sở dữ liệu có thể tồn tại được định nghĩa khi cơ sở dữ liệu được tạo ra. Một chương trình cũng có thể sắp xếp thứ tự cho cơ sở dữ liệu sau khi cơ sở dữ liệu được tạo ra bằng việc sử dụng hàm PegSetDatabaseInfo. Tuy nhiên, bởi vì hệ thống phải xem lại danh mục quản lý thứ tự sắp xếp, do đó việc thay đổi thứ tự sắp xếp có thê sử dụng một lượng lớn tài nguyên hệ thống, và có thể mất nhiều thời gian để hoàn thành.
4.6. Tìm kiếm các bản ghi
Các bản ghi trong cơ sở dữ liệu có thể lấy về từ bất cứ chỗ nào mà con trỏ tìm kiếm của cơ sở dữ liệu hiện tại trỏ tới. Vì vậy, một chương trình cần phải tìm kiếm bản ghi được yêu cầu trước khi đọc hoặc thay đổi dữ liệu. Hàm PegSeekDatabase được dùng để tìm kiếm bản ghi yêu cầu trong cơ sở dữ liệu. Bản ghi đó có thể được xác định rõ bằng từ định danh của nó hoặc bằng một giá trị liên quan ví dụ như thuộc tính “name” bằng “John Doe”. Khi hàm PegSeekDatabase tìm kiếm bản ghi yêu cầu, con trỏ tìm kiếm được đặt vào vị trí bản ghi đó. Sau đó, chương trình có thể đọc hoặc sửa đổi bản ghi đó.
Thứ tự ở trong việc tìm kiếm các bản ghi của hệ thống phụ thuộc vào thứ tứ sắp xếp có hiệu lực trong cơ sở dữ liệu. Ví dụ, khi tìm kiếm giá trị của “John Doe”, thì hệ thống chỉ tìm kiếm trong các thuộc tính mà có cùng tên thuộc tính vì vậy thứ tứ sắp xếp tên thuộc tính được xác định khi mở cơ sở dữ liệu. Dưới đây là một số đối số của hàm PegSeekDatabase
Các đối số của hàm PegSeekDatabase
Các đối số của hàm PegSeekDatabase
Miêu tả
HANDLE hDatabase
Nhận biết cơ sở dữ liệu mà thực hiện tìm kiếm trong cơ sở dữ liệu đó.
DWORD dwSeekType
Chỉ ra kiểu của phương thức tìm kiếm để thực hiện
DWORD dwValue
Chỉ ra giá trị sử dụng cho phương thức tìm kiếm. Ý nghĩa của đối số này phụ thuộc vào giá trị của dwSeekType.
LPDWORD lpdwIndex
Trỏ tới một biến mà nó có thể lấy về vị trí tính từ điểm bắt đầu cơ sở dữ liệu cho tới điểm bắt đầu bản ghi đã được tìm thấy.
Các loại phương thức tìm kiếm mà hàm PegSeekDatabase có thể thực hiện. Bảng dưới đây miêu tả các giá trị có thể dùng cho đối số dwSeekType của hàm PegSeekDatabase.
Các loại phương thức tìm kiếm của hàm PegSeekDatabase
PEGDB_SEEK_PEGOID: Tìm kiếm cho tới khi tìm thấy một đối tượng có từ định danh được xác định bằng đối số dwValue. Cách tìm kiếm này có hiệu suất rất cao.
PEGDB_SEEK_VALUESMALLER: Tìm kiếm cho tới khi tìm thấy giá trị lớn nhất nhưng nhỏ hơn giá trị đã cho. Nếu không có giá trị nào trong tất cả các bản ghi nhỏ hơn giá trị cho ban đầu thì con trỏ tìm kiếm trỏ tới bên trái tận cùng cơ sở dữ liệu, và hàm trả vể giá trị là zero. Đối số dwValue là một con trỏ cấu trúc PEGPROPVAL. Độ phức tạp của phép tìm kiếm này là O(n).
PEGDB_SEEK_VALUEFIRSTEQUAL: Tìm kiếm đến khi tìm được giá trị đầu tiên bằng với giá trị đã cho ban đầu. Nếu quá trình tìm kiếm không thành công thì con trỏ tìm kiếm được đặt ở vị trí bên trái của tận cùng cơ sở dữ liệu, và hàm trả về giá trị là zero. Đối số dwValue là một con trỏ cấu trúc PEGPROPVAL. Độ phức tạp của phép tìm kiếm này là O(n).
PEGDB_SEEK_VALUENEXTEQUAL: Bắt đầu vị trí hiện tại, tìm kiếm chính xác ở vị trí tiếp theo trong bảng đã sắp xếp thứ tự và kiểm tra nếu bản ghi tiếp theo có giá trị bằng giá trị đã cho thì hàm trả về từ định danh đối tượng của bản ghi tiếp theo, ngược lại thì trả về zero và chuyển con trỏ đên tận cùng của cơ sở dữ liệu. Phép tìm kiếm này có thể dùng chung với phép PEFDB_SEEK_VALUEFIRSTEQUAL để liệt kê tất cả các bản ghi có giá trị bằng. Đối số dwValue chỉ rõ giá trị để tìm kiếm. Độ phức tạp của phép tìm kiếm này là O(1).
PEGDB_SEEK_CURRENT: Tìm kiếm ngược lại hoặc tiến lên kể từ vị trí hiện tại của con trỏ tìm kiếm đến số bản ghi đã định. Đối số dwValue chỉ rõ số của bản ghi từ vị trí hiện tại. Hàm tìm kiếm tiến lên nếu dwValue là giá trị dương, hoặc ngược lại khi nó nhận giá trị âm. Tìm kiếm tiến lên thì hiệu quả. Độ phức tập của tìm kiếm ngược là O(n).
PEGDB_SEEK_END: Tìm kiếm ngược từ cuối cơ sở dữ liệu cho tới số của bản ghi đã cho ban đầu. Đối số dwValue chỉ rõ số của bản ghi. Độ phức tạp của phép tìm kiếm này là O(n).
Nếu hàm PegSeekDatabase thực hiện thành công thì giá trị trả về là từ định danh đối tượng PEGOID của bản ghi. Nếu tìm kiếm không thành công hàm trả về giá trị zero. Hàm GetLastError có thể trả về lỗi ERROR_INVALID_PARAMETER nếu đối số của hàm PegSeekDatabase không hợp lệ.
4.7. Đọc bản ghi
Sau khi một cơ sở dữ liệu được mở, thao tác chủ yếu là đọc thông tin. Dữ liệu được đọc từ cơ sở dữ liệu của Windows CE bằng hàm PegReadRecordProps.
Không giống với cú pháp của cơ sở dữ liệu SQL, một chương trình không chỉ rõ tập có chứa bản ghi để đọc ví dụ mệnh đề “where”. Thay vào đó, các thuộc tính được đọc từ bản ghi có vị trí là vị trí hiện tại mà con trỏ tìm kiếm trỏ vào. Khi một cơ sở dữ liệu của Windows CE được mở, con trỏ tìm kiếm được đặt ở vị trí bản ghi đầu tiên theo thứ tự sắp xếp đã định. Ngoài ra, nếu chương trình chỉ rõ cờ PEGDB_AUTOINCREMENT khi mở CSDL, con trỏ tìm kiếm sẽ tăng theo bản ghi tiếp theo theo thứ tự sắp xếp mỗi lần gọi hàm PegReadRecordProps.
Hàm PegReadRecordProps được dùng để đọc nhiều thuộc tính cùng một lúc. Các thuộc tính này được đọc thông qua các đối số của hàm PegReadRecordProps, đó là một mảng các từ định danh thuộc tính(PEGPROPID). Một đối số khác là số của từ định danh thuộc tính, mà được liệt kể vào trong một mảng. Định rõ là NULL cho mảng mà yêu cầu hệ thống truy lục tất cả các thuộc tính trong bản ghi hiện tại.
Một đối số nữa của hàm PegReadRecordProps là bộ đệm để lưu kết quả. Chương trình chỉ rõ bộ đệm để hệ thống viết các thông tin về thuộc tính và chỉ rõ kích thước của bộ đệm. Mặc dù, một chương trình có thể có thể gọi hàm PegReadRecordProps để xác định kích thước của bộ đệm khi cần thiết và sau đó gọi lại hàm để truy vấn dữ liệu, nhưng hệ thống làm cho chức năng phổ biến này rất thuận lợi. Trong trường hợp thông tin lưu trữ quá ít, thì hệ thống sẽ cấp phát lại bộ đêm – buffer nếu chương trình gọi cờ PEGDB_ALLOWREALLO. Trường hợp chương trình đặt bộ đệm với giá trị NULL, thì hệ thống sẽ cấp phát và sử dụng bộ đệm trong kích thước chính xác.
Mặc dù một chương trình có thể đọc số lượng bất kỳ các thuộc tính của bản ghi hiện tại, hệ thống lại lưu trữ bản ghi theo định dạng nén do đó cần phải giải nén các bản ghi trước khi các thuộc tính được đọc. Để đạt hiệu quả cao, chương trình nên đọc tất cả các thuộc tính cần thiết trong một lần gọi đơn hơn là dùng nhiều lần gọi song song với nhau.
Nếu hàm PegReadRecordProps thực hiện thành công, thì các thông tin về thuộc tính yêu cầu được copy vào bộ đệm đã được chỉ định. Kết quả bộ đệm có một mảng cấu trúc PEGPROPVAL. Bằng cách sử dụng PEGPROPID của mỗi cấu trúc PEGPROPVAL, chương trình có thể xác định được giá trị của mỗi thuộc tính. Giá trị của thuộc tính có thể thay đổi theo kích thước. Dưới đây là một đoạn mã mô tả quá trình đọc các thuộc tính từ cơ sở dữ liệu của Windows CE.
PEGOID objId;
HANDLE hDb;
WORD cProps;
LPBYTE pBuf = NULL;
DWORD cbBuf = 0;
hDb = PegOpenDatabase(&objId, // tên định danh của cơ sở dữ liệu
szDbName, // tên của database
0, // không thứ tự sắp xếp
PEGDB_AUTOINCREMENT, // các cờ
NULL); // không có của sổ thông báo
while (objId = PegReadRecordProps(hDb, // thao tác cơ sở dữ liệu
PEGDB_ALLOWREALLOC, // cho phép cấp phát lại
&cProps, // số các thuộc tính cần đọc
NULL, // đọc tất cả các thuộc tính
&pBuf, // bộ đệm dữ liệu thuộc tính
&cbBuf)) // kích thước của bộ đệm
{
//sử dụng giá trị các thuộc tính vừa đọc
}
CloseHandle(hDb); // đóng trình điều khiển đọc cơ sở dữ liệu hDB
4.8. Viết các bản ghi
Dữ liệu được viết trong CSDL bằng hàm PegWriteRecordProps. Hàm này có thể được sử dụng để tạo một bản ghi mới hoặc thay đổi bản ghi đã tồn tại.
Mỗi bản ghi bao gồm một tập các thuộc tính. Để viết các thuộc tính đó vào trong một bản ghi, chương trình phải tạo ra một mảng cấu trúc PEGPROPVAL. Mỗi một cấu trúc PEGPROPVAL là tên thuộc tính và giá trị tương ứng với thuộc tính.
Dùng hàm PegWriteRecordProps để viết tất cả các thuộc tính yêu cầu vào trong bản ghi đã định. Cũng như việc đọc các thuộc tính từ các bản ghi, chương trình nên viết tất cả các thuộc tính của bản ghi tại một thời điểm để tránh sự va chạm khi lưu dữ liệu ở dạng nén.
Hàm PegWriteRecordProps được sử dụng để tạo bản ghi mới và thay đổi bản ghi đã tồn tại. Nếu đối số của hàm là một bản ghi đã tồn tại thì hàm sẽ cập nhật các thuộc tính cho bản ghi đó. Nếu từ định danh của bản ghi đặt bằng 0 thì một bản ghi mới được đưa vào cơ sở dữ liệu với các thuộc tính đã xác định. Hàm PegWriteRecordProps không sử dụng hoặc di chuyển con trỏ tìm kiếm.
Một chương trình có thể xoá một thuộc tính hoặc cả một bản ghi đã tồn tại. Dùng cờ PEGDB_PROPDELETE trong cấu trúc PEGPROPVAL để báo cho hàm PegWriteRecordProps di chuyển thuộc tính được cung cấp.
Mô tả các đối số của hàm PegWriteRecordProps
HANDLE hDbase: Nhận dạng cơ sở dữ liệu đã mở. Cơ sở dữ liệu phải được mở trước khi gọi hàm PegOpenDatabase.
PEGOID oidRecord: Nhận dạng bản ghi mà có các thuộc tính đã định được ghi. Đối số này là zero, một bản ghi mới được tạo ra và được điền khớp với các thuộc tính đã xác định.
WORD cPropID: Cho biết số thuộc tính trong mảng đã xác định bằng đối số rgPropVal. Đối số cPropID cần được đặt bằng zero.
PEGPROPBVAL * rgPropVal: Trỏ tới một mảng của cấu trúc PEGPROPVAL mà nó chỉ ra giá trị của thuộc tính được viết trong bản ghi.
Nếu hàm PegWriteRecordProps thực hiện thành công, trả về giá trị là tên của bản ghi với các thuộc tính đã được ghi. Nếu không thành công, trả về zero. Chương trình có thể sử dụng hàm GetLastError để có thêm thông tin về lỗi. Bảng dưới đây liệt kê các lỗi mà hàm GetLastError có thể trả về.
ERROR_DISK_FULL: Không đủ khoảng trống bộ nhớ trong đối tượng lưu trữ để viết các bản ghi.
ERROR_INVALID _PARAMETER: Lỗi đối số không hợp lệ.
Đoạn lệnh sau mô tả quá trình viết một bản ghi vào trong cơ sở dữ liệu Windows CE:
PEGPROPVAL NewProp; // thuộc tính mới có chứa blob...
PEGBLOB blob; // blob chưa một dãy byte...
BYTE * pBuf = NULL; // ...và đây là dữ liệu thực tế
UINT cbBuf; // tính số bytes cân có trong blob
...
// kích thước ngoài cân thiết, sau đó định vị
pBuf = (BYTE *) LocalAlloc(LMEM_FIXED, cbBuf);
// đặt dữ liệu thực vào
Các file đính kèm theo tài liệu này:
- Hệ thống xây dựng cơ sở dữ liệu biểu thuế trên WindowsCE và các chức năng tìm kiếm thuế.doc