Bài giảng MySQL và C
MySQL cung cấp một thư viện viết bằng C để làm việc với DBMS Các tính năng: Kết nối với máy chủ (sử dụng SSL – secured socket layer) Gửi các câu truy vấn, nhận và xử lý kết quả Kiểm tra và xử lý lỗi
Bạn đang xem nội dung tài liệu Bài giảng MySQL và C, để tải tài liệu về máy bạn click vào nút DOWNLOAD ở trên
MySQL & C
1 EE4509, EE6133 – HK2 2011/2012
TS. Đào Trung Kiên – ĐH Bách khoa Hà Nội
Giới thiệu
MySQL cung cấp một thư viện viết bằng C để làm
việc với DBMS
Các tính năng:
Kết nối với máy chủ (sử dụng SSL – secured socket
layer)
Gửi các câu truy vấn, nhận và xử lý kết quả
Kiểm tra và xử lý lỗi
2 EE4509, EE6133 – HK2 2011/2012
TS. Đào Trung Kiên – ĐH Bách khoa Hà Nội
Thiết lập thư viện
Include (cần khi biên dịch):
#include
#include
Thư viện (cần khi biên dịch):
#pragma comment(lib, "libmysql.lib")
Hoặc thêm vào danh sách các thư viện dịch (xem trang sau)
Thư viện động (cần khi chạy chương trình):
libmysql.dll
Khởi tạo thư viện:
int mysql_library_init(int argc,
char** argv, char **groups)
Có thể bỏ qua, không cần gọi hàm này nếu chương trình chỉ có một tiến
trình chạy (mono-thread)
Kết thúc sử dụng thư viện: mysql_library_end()
3 EE4509, EE6133 – HK2 2011/2012
TS. Đào Trung Kiên – ĐH Bách khoa Hà Nội
Thêm thư viện để liên kết
4 EE4509, EE6133 – HK2 2011/2012
TS. Đào Trung Kiên – ĐH Bách khoa Hà Nội
Ví dụ
#include
#include
#include
int main() {
if (mysql_library_init(0, NULL, NULL)) {
fprintf(stderr, "could not initialize MySQL library\n");
exit(1);
}
/* ... */
mysql_library_end();
return 0;
}
5 EE4509, EE6133 – HK2 2011/2012
TS. Đào Trung Kiên – ĐH Bách khoa Hà Nội
Các kiểu dữ liệu
MYSQL: chứa thông tin về kết nối tới DBMS
MYSQL_RES: chứa kết quả trả về của các câu truy
vấn có trả về kết quả là các hàng (các câu lệnh:
select, show, explain)
MYSQL_ROW: dữ liệu của một hàng trong kết quả
MYSQL_FIELD: dữ liệu của một trường trong một
hàng của kết quả
6 EE4509, EE6133 – HK2 2011/2012
TS. Đào Trung Kiên – ĐH Bách khoa Hà Nội
Thiết lập và đóng kết nối
Tạo kết nối:
MYSQL* conn = mysql_init(NULL);
mysql_real_connect(conn, server_addr,
username, password, database_name,
0, NULL, 0);
Đóng kết nối:
mysql_close(conn);
7 EE4509, EE6133 – HK2 2011/2012
TS. Đào Trung Kiên – ĐH Bách khoa Hà Nội
Ví dụ
int main (int argc, char *argv[]) {
MYSQL* conn = mysql_init (NULL);
if (conn == NULL) return 1;
if (mysql_real_connect (conn, opt_host_name,
opt_user_name, opt_password,
opt_db_name, opt_port_num,
opt_socket_name, opt_flags) == NULL) {
fprintf (stderr, "failed\n");
mysql_close (conn);
}
mysql_close (conn);
return 0;
}
8 EE4509, EE6133 – HK2 2011/2012
TS. Đào Trung Kiên – ĐH Bách khoa Hà Nội
Kiểm tra lỗi
MySQL cung cấp các hàm sau để lấy thông tin về lỗi
khi xảy ra:
unsigned int mysql_errno(MYSQL* conn)
Trả về mã lỗi
const char *mysql_error(MYSQL* conn)
Trả về thông điệp lỗi
Thông tin thêm về mã và các thông điệp lỗi (bản
5.0):
9 EE4509, EE6133 – HK2 2011/2012
TS. Đào Trung Kiên – ĐH Bách khoa Hà Nội
Thực hiện câu truy vấn
Để gửi và thực hiện câu truy vấn, dùng hàm:
int mysql_query(MYSQL* conn,
const char* stmt)
int mysql_real_query(MYSQL* conn,
const char* stmt, unsigned long len)
Các tham số:
stmt: chuỗi chứa câu truy vấn
len: độ dài của chuỗi chứa câu truy vấn
Trả về 0 nếu thành công, khác 0 nếu có lỗi
10 EE4509, EE6133 – HK2 2011/2012
TS. Đào Trung Kiên – ĐH Bách khoa Hà Nội
Lấy kết quả trả về
Sau thực hiện câu truy vấn, gọi hàm:
MYSQL_RES* mysql_store_result(MYSQL* conn)
Tiếp theo gọi hàm sau để lấy từng hàng kết quả:
MYSQL_ROW mysql_fetch_row(MYSQL_RES* result)
Trả về NULL nếu kết thúc kết quả
Cuối cùng, kết thúc và giải phóng bộ nhớ đệm chứa kết
quả:
void mysql_free_result(MYSQL_RES* result)
Di chuyển con trỏ đọc kết quả:
MYSQL_ROW_OFFSET mysql_row_seek(MYSQL_RES* result,
MYSQL_ROW_OFFSET offset)
MYSQL_ROW_OFFSET mysql_row_tell(MYSQL_RES* result)
11 EE4509, EE6133 – HK2 2011/2012
TS. Đào Trung Kiên – ĐH Bách khoa Hà Nội
Các thông tin về kết quả trả về
Số thuộc tính (trường) của kết quả:
unsigned int mysql_num_fields(MYSQL_RES* result)
Số hàng:
my_ulonglong mysql_num_rows(MYSQL_RES* result)
ID của dữ liệu mới được thêm (câu lệnh insert):
my_ulonglong mysql_insert_id(MYSQL *mysql)
ID phải được định nghĩa với thuộc tính AUTO_INCREMENT
Số hàng đã bị thay đổi (câu lệnh insert, update,…)
my_ulonglong mysql_affected_rows(MYSQL *mysql)
12 EE4509, EE6133 – HK2 2011/2012
TS. Đào Trung Kiên – ĐH Bách khoa Hà Nội
Ví dụ - select
if (mysql_query(conn, "select * from USER") != 0)
handle_error(conn);
else {
MYSQL_RES* result = mysql_store_result(conn);
printf("Number of rows: %d\n", mysql_num_rows(result);
MYSQL_ROW row;
while (row = mysql_fetch_row(result)) {
printf("%s, %s, %s, %s\n",
row[0], row[1], row[2], row[3]);
}
mysql_free_result(result);
}
13 EE4509, EE6133 – HK2 2011/2012
TS. Đào Trung Kiên – ĐH Bách khoa Hà Nội
Ví dụ - insert
if (mysql_query(conn, "insert into
User(username, password, level)
values('superhero', 'chipchip', 3)") != 0)
handle_error(conn);
else {
printf("%d rows added\n",
mysql_affected_rows(conn));
printf("ID of inserted user: %d\n",
mysql_insert_id(conn));
}
14 EE4509, EE6133 – HK2 2011/2012
TS. Đào Trung Kiên – ĐH Bách khoa Hà Nội
Ví dụ - update
if (mysql_query(conn, "update User
set level = 5
where id in (2, 3, 4)") != 0)
handle_error(conn);
else {
printf("%d rows updated\n",
mysql_affected_rows(conn));
}
15 EE4509, EE6133 – HK2 2011/2012
TS. Đào Trung Kiên – ĐH Bách khoa Hà Nội
Bài tập
1. Định nghĩa một quan hệ SinhVien, sau đó viết một
chương trình C nhập thông tin sinh viên, thêm vào
CSDL và in ra ID của sinh viên vừa được thêm
2. Viết chương trình C nhập ID của một sinh viên và
in ra thông tin của sinh viên đó
3. Viết chương trình C nhập tên của sinh viên và in ra
thông tin những người có tên như đã nhập
16 EE4509, EE6133 – HK2 2011/2012
TS. Đào Trung Kiên – ĐH Bách khoa Hà Nội