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

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