普通用户使用客户端应用程序(Client Application)和服务器程序(Server Application)通信以取得服务, 而服务器程序通常要和数据库服务器通信以取得数据存取服务, 这时就需要使用到使用到数据库连接技术, 我本人将使用数据库连接技术编程, 称为数据库应用程序编程, 更多时候的数据库应用程序编程依赖数据库发行商提供的驱动程序或接口模块.
MySQL 为程序员提供了多种编程语言的接口, 如使用 C 语言编程, 则可以下载 MySQL Connector C 套件, 解压后得到 include 目录下的头文件, 和 lib 目录下的共态链接库 libmysql.dll, 该动态链接库 的导入库libmysql.lib, 以及静态对象库 mysqlclient.lib, 显然, 使用动态链接库的编译速度更快.
关于这些 API 的使用方法, 请参考官方文档, 下面是一个演示.
1 #include <Windows.h> 2 #include <stdio.h> 3 #include <stdlib.h> 4 #include <tchar.h> 5 #include <assert.h> 6 #include <C:Program FilesMySQLMySQL Connector C 6.1includemysql.h> 7 8 #pragma comment(lib, "C:\Program Files\MySQL\MySQL Connector C 6.1\lib\libmysql.lib") 9 10 void Todo(MYSQL *mysql) { 11 12 const char *a = mysql_stat(mysql); 13 printf("数据库连接状态: " 14 "%s ", a); 15 16 // 创建一个数据库 17 char cmd[1024]; 18 sprintf(cmd, "CREATE DATABASE `my_test_db`"); 19 20 if (mysql_query(mysql, cmd) != EXIT_SUCCESS) { 21 printf("创建失败! " 22 "%d: %s ", mysql_errno(mysql), mysql_error(mysql)); 23 } else { 24 printf("创建成功! "); 25 } 26 27 // 选择数据库 28 sprintf(cmd, "USE `my_test_db`"); 29 if (mysql_query(mysql, cmd) != EXIT_SUCCESS) { 30 printf("选择失败! " 31 "%d: %s ", mysql_errno(mysql), mysql_error(mysql)); 32 return ; 33 } else { 34 printf("选择了表! "); 35 } 36 37 // 创建表 38 sprintf(cmd, "CREATE TABLE `t`(" 39 "ID INT NOT NULL AUTO_INCREMENT," 40 "Name VARCHAR(20) NOT NULL," 41 "PRIMARY KEY(ID)" 42 ")"); 43 if (mysql_query(mysql, cmd) != EXIT_SUCCESS) { 44 printf("创建失败! " 45 "%d: %s ", mysql_errno(mysql), mysql_error(mysql)); 46 } 47 48 // 查看表型 49 sprintf(cmd, "DESC `t`"); 50 if (mysql_query(mysql, cmd) != EXIT_SUCCESS) { 51 52 printf("查看失败! " 53 "%d: %s ", mysql_errno(mysql), mysql_error(mysql)); 54 55 } else { 56 57 // 取结果集 58 MYSQL_RES *res; 59 res = mysql_store_result(mysql); 60 61 if (res == NULL) { 62 printf("查询没有返回结果 "); 63 } else { 64 65 int fc = mysql_field_count(mysql); 66 printf("字段数量: %u. ", fc); 67 // 一行一行地取结果 68 MYSQL_ROW row; 69 while (row = mysql_fetch_row(res)) { 70 int i = 0; 71 for (; i < fc; i++) { 72 printf("|%s ", row[i] != NULL ? row[i] : "NULL"); 73 } 74 printf(" "); 75 } 76 } 77 } 78 } 79 80 void Test() { 81 82 // 初始化 MySQL 客户端模块 83 assert(mysql_library_init(0, NULL, NULL) == EXIT_SUCCESS); 84 85 // 获取数据库描述符 86 MYSQL *mysql = NULL; 87 mysql = mysql_init(mysql); 88 // 连接数据库 89 if (mysql_real_connect(mysql, "localhost", "root", "passwd", NULL, 3306, NULL, 0) == NULL) { 90 printf("连接失败! "); 91 printf("%d: %s ", mysql_errno(mysql), mysql_error(mysql)); 92 } 93 94 // 你想用数据库做些什么事情? 95 Todo(mysql); 96 97 // 关闭数据库连接 98 mysql != 0 ? mysql_close(mysql) : 0; 99 // 释放模块 100 mysql_library_end(); 101 } 102 103 int APIENTRY _tWinMain(HINSTANCE hInst, HINSTANCE hPrev, LPTSTR lpszCmdLine, int iCmdShow) { 104 105 // 分配控制台 106 AllocConsole(); 107 108 // 109 Test(); 110 111 printf(" " 112 "The end. "); 113 114 // 消息循环 115 MSG msg; 116 while (GetMessage(&msg, NULL, 0, 0) > 0) { 117 TranslateMessage(&msg); 118 DispatchMessage(&msg); 119 } 120 121 return EXIT_SUCCESS; 122 }
第一次运行:
再次运行: