CHƯƠNG III : LẬP TRèNH
3.4 SỬ DỤNG GIAO DIỆN MỨC GỌI (callưlevel interface)
3.4.1 Nhập mụn SQL/CLI
Một chương trỡnh được viết trong ngụn ngữ C và sử dụng SQL/CLI sẽ chứa file đầu sqlcli.h, từ đú nú nhận được một số lớn cỏc hàm, cỏc định nghĩa kiểu, cỏc cấu trỳc và cỏc hằng ký hiệu. Sau đú chương trỡnh cú thể tạo ra và làm việc với 4 loại bản ghi:
1. Mụi trường: Một bản ghi kiểu này được tạo ra bằng một chương trỡnh ứng dụng (client) trong việc chuẩn bị cho một hoặc nhiều kết nối đến server cơ sở dữ liệu.
2. Kết nối: Một trong cỏc bản ghi này được tạo ra để kết nối chương trỡnh ứng dụng với cơ sở dữ liệu. Mỗi kết nối tồn tại bờn trong một mụi trường nào đấy.
3. Cõu lệnh: Một chương trỡnh ứng dụng cú thể tạo ra một hoặc nhiều bản ghi cõu lệnh. Mỗi bản ghi giữ thụng tin về một lệnh SQL đơn giản bao gồm một cursor mặc nhiờn nếu cõu lệnh là một truy vấn. Ở cỏc thời điểm khỏc nhau, cựng một lệnh CLI cú thể biểu diễn cỏc lệnh SQL khỏc nhau. Mỗi một cõu lệnh CLI tồn tại bờn trong một kết nối nào đấy.
4. Mụ tả: Cỏc bản ghi này giữ thụng tin về cỏc bộ hoặc về cỏc tham số. Chương trỡnh ứng dụng hoặc mỏy chủ cơ sở dữ liệu sẽ thiết lập cỏc thành phần của cỏc bản ghi mụ tả để chỉ ra tờn và kiểu của cỏc thuộc tớnh và/hoặc cỏc giỏ trị của chỳng. Mỗi cõu lệnh cú nhiều cỏc bản ghi được tạo ra một cỏch khụng tường minh như vậy, và người dựng cú thể tạo ra nhiều hơn nếu cần. Trong trỡnh bày của chỳng ta về CLI, cỏc bản ghi mụ tả nối chung là sẽ khụng nhỡn thấy.
Mỗi một bản ghi này được biểu diễn trong chương trỡnh ứng dụng bằng một handle, đú là một con trỏ đến bản ghi. File sqlcli.h cung cấp cỏc kiểu đối với cỏc handle mụi trường, kết nối, cõu lệnh, mụ tả tương ứng là: SQLHENV, SQLHDBC,SQLHSTMT, SQLHDESC, mặc dự chỳng ta cú thể nghĩ về chỳng như cỏc biến trỏ hoặc cỏc số nguyờn. Chỳng ta sẽ sử dụng cỏc kiểu này và một số kiểu được định nghĩa khỏc với cỏc giải thớch rừ ràng, như là SQLCHAR và SQLINTEGER. Cỏc kiểu này được cung cấp trong sqlcli.h.
Chỳng ta sẽ khụng đi đến chi tiết về việc cỏc mụ tả được thiết lập và được sử dụng như thế nào. Tuy nhiờn ta sẽ bàn về ba kiểu bản ghi khỏc được tạo ra bằng cỏch sử dụng một hàm
1. hType là kiểu của handle mong muốn. Sử dụng SQL_HANDLE_ENV cho một mụi trường mới, SQL_HANDLE_DBC cho một kết nối mới, hoặc SQL_HANDLE_STMT cho một cõu lệnh mới.
2. hIn là một handle của phần tử mức cao trong dú phần tử vừa mới tạo ra sống. Tham số này là SQL_NULL_HANDLE nếu chỳng ta muốn một mụi trường; tờn của mụi trường là một hằng được định nghĩa núi với SQLAllocHandle rằng khụng cú giỏ trị thớch hợp ở đõy. Nếu chỳng ta muốn một handle kết nối thỡ hIn là handle của mụi trường mà trong đú cú tồn tại kết nối. Nếu chỳng ta muốn một handle cõu lệnh, thỡ hIn là handle của kết nối mà trong đú cõu lệnh sẽ tồn tại.
3. hOut là địa chỉ của handle do SQLAllocHandle tạo ra.
SQLAllocHandle cũng trả lại một giỏ trị thuộc kiểu SQLRETURN (một số nguyờn). Giỏ trị này là 0 nếu khụng cú lỗi nào xảy ra, và là một giỏ trị khỏc 0 nếu cú xuất hiện lỗi.
Vớ dụ 3.18 Chỳng ta hóy xem hàm HangLuong của hỡnh 3.4 sẽ bắt đầu trong CLI như thế nào. (Hàm HangLuong đó được chỳng ta sử dụng như một vớ dụ về SQL nhỳng). Nhớ lại rằng hàm này khảo sỏt tất cả cỏc bộ của NHÂNVIấN và xếp loại lương của chỳng. Cỏc bước đầu tiờn được chỉ ra ở hỡnh 3.1.8:
1) #include sqlcli.h 2) SQLHENV MyEnv; 3) SQLHDBC MyCon; 4) SQLHSTMT execStat
5) SQLRETURN errorCode1, errorCode2, errorCode3; 6) ErrorCode1=SQLAllocHandle(SQL_HANDLE_ENV,
SQL_NULL_HANDLE, &myEnv); 7) If(!errorCode1)
8) ErrorCode2 = SQLAllocHandle(SQL_HANDLE_DCB, myEnv, &myCon);
10)
ErrorCode3=SQLAllocHandle(SQL_HANDLE_STMT,myCon,&execS tat);
Hỡnh 3.18: Mụ tả và tạo ra một mụi trường, một kết nối và một lệnh.
Cỏc dũng từ 2) đến 4) mụ tả handle cho một mụi trường, kết nối và cõu lệnh tương ứng. Tờn của chỳng là myEnv, myCon và execStat tương ứng. Chỳng ta dự kiến rằng execStat sẽ biểu diễn lệnh
SELECT Luong FROM NHÂNVIấN ;
giống như con trỏ execCursor đó làm trong hỡnh 3.4 nhưng vẫn chưa cú lệnh SQL nào được liờn kết với execStat. Dũng 5) khai bỏo ba biến mà cỏc lời gọi hàm cú thể đặt trả lời của chỳng vào đú và chỉ ra một lỗi. Một giỏ trị 0 chỉ ra khụng cú lỗi nào xảy ra trong lời gọi và chỳng ta đang mong đợi trường hợp đú.
Dũng 6) gọi SQLAllocHandle, yờu cầu một handle mụi trường (đối số thứ nhất), cung cấp một handle null trong đối số thứ hai (bởi vỡ khi chỳng ta đang yờu cầu một handle mụi trường thỡ chỳng ta khụng cần gỡ cả) và cung cấp một địa chỉ của myEnv như là đối số thứ ba; handle được tạo ra sẽ được đặt ở đõy. Nếu dũng 6) là thành cụng, cỏc dũng 7) và 8) sử dụng handle mụi trường để nhận một handle kết nối trong myCon. Giả thiết rằng lời gọi đú cũng thành cụng, cỏc dũng 9) và 10) nhận một handle lệnh cho execStat.