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
16 trang |
Chia sẻ: vietpd | Lượt xem: 1706 | Lượt tải: 2
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