Tải bản đầy đủ (.pdf) (16 trang)

Bài 8 MySQL và Ngôn ngữ lập trình C

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (340.13 KB, 16 trang )

Bài 8: MySQL & C
1
EE4509, EE4253, EE6133 – HK1 2013/2014
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, EE4253, EE6133 – HK1 2013/2014
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 <winsock.h>
#include <mysql.h>
 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, EE4253, EE6133 – HK1 2013/2014
TS. Đào Trung Kiên – ĐH Bách khoa Hà Nội
Thêm thư viện để liên kết

4
EE4509, EE4253, EE6133 – HK1 2013/2014
TS. Đào Trung Kiên – ĐH Bách khoa Hà Nội
Ví dụ
 #include <winsock.h>
#include <mysql.h>
#include <stdlib.h>

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, EE4253, EE6133 – HK1 2013/2014
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, EE4253, EE6133 – HK1 2013/2014
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, EE4253, EE6133 – HK1 2013/2014
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, EE4253, EE6133 – HK1 2013/2014
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, EE4253, EE6133 – HK1 2013/2014
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, EE4253, EE6133 – HK1 2013/2014
TS. Đào Trung Kiên – ĐH Bách khoa Hà Nội
Lấy kết quả trả về
 Sau khi 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, EE4253, EE6133 – HK1 2013/2014
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, EE4253, EE6133 – HK1 2013/2014
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, EE4253, EE6133 – HK1 2013/2014
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, EE4253, EE6133 – HK1 2013/2014
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, EE4253, EE6133 – HK1 2013/2014
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, EE4253, EE6133 – HK1 2013/2014
TS. Đào Trung Kiên – ĐH Bách khoa Hà Nội

×