MySQL C 语言应用程序接口开发教程(1)

关于教程
这是一篇 MySQL 数据库的 C 语言开发教程。它讲述了用 C 语言开发 MySQL 应用程序的基本过程。

关于 MySQL 数据库
MySQL 是一个重要的开放源代码的、多用户的、多线程的数据库管理系统。MySQL 在 Web 应用中很流行。它是非常流行的 LAMP(Linux, Apache, MySQL, PHP) 架构的一部分。MySQL 被瑞典一家名为 MySQL AB 并对开源事业有杰出贡献的公司所有。MySQL 数据库可以运行在很多的操作系统上,如 BSD, Unix, Linux Windows 和 Mac。维基百科和 Youtube 都在使用 MySQL。这些站点一天有数百万将的查询。MySQL 有两个版本,分别是 MySQL 服务器系统和 MySQL 嵌入式系统。

第一个实例
我们第一个实例将要测试调用一个 MySQL 函数。

#include <my_global.h>
#include <mysql.h>
 
int main(int argc, char * argv[])
{
	printf("MySQL client version: %s\n", mysql_get_client_info());
	return 0;
}

函数 mysql_get_client_info()返回 MySQL 客户端版本信息。

gcc version.c -o version `mysql_config --cflags --libs`
./version

这是是如何编译和运行这个实例。

MySQL client version: 5.0.38
#include <my_global.h>
#include <mysql.h>

我们包含两个需要的头文件: mysql.h MySQL 函数调用的最重要的头文件。my_global.h 包含了一些全局的声明和标准输入/输出头文件。

printf("MySQL client version: %s\n", mysql_get_client_info());

这行代码输入了 MySQL 客户端的版本信息。我们调用了 mysql_get_client_info()函数。

创建一个数据库
在第二个实例中创建一个数据库。

#include <my_global.h>
#include <mysql.h>
 
int main(int argc, char * argv[])
{
	MYSQL * conn;
 
	conn = mysql_init(NULL);
 
	if (conn == NULL) {
		printf("Error %u: %s\n", mysql_errno(conn), mysql_error(conn));
		exit(1);
	}
 
	if (mysql_real_connect(conn, "localhost", "username", "password", NULL, 0, NULL, 0) == NULL) {
		printf("Error %u: %s\n", mysql_errno(conn), mysql_error(conn));
		exit(1);
	}
 
	if (mysql_query(conn, "CREATE DATABASE testdb")) {
		printf("Error %u: %s\n", mysql_errno(conn), mysql_error(conn));
		exit(1);
	}
 
	mysql_close(conn);
 
	return 0;
}

这段代码连接了 MySQL 数据库系统并创建了一个名为 testdb 的数据库。

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| testdb             |
+--------------------+
3 rows in set (0.00 sec)

检验的确创建了一个新的库。

在这段实例中我们包含了错误检测,检查可能出现的错误是非常重要的。在数据库开发领域里,很多地方都可能出错。为了有清晰的代码之后的实例中将不包含错误检查,我们假设所有人清楚错误检测是开发人员的责任

实例分为如下的部分:

  • 初始化一个连接对象结构
  • 创建一个连接
  • 执行一个查询
  • 关闭连接
MYSQL * conn;

我们声明一个 MYSQL 结构指针,这个结构是连接对象。

conn = mysql_init(NULL);

mysql_init() 函数返回一个连接对象。

if (conn == NULL) {
	printf("Error %u: %s\n", mysql_errno(conn), mysql_error(conn));
	exit(1);
}

我们检查返回值,如果 mysql_init() 调用失败打印错误消息并中止应用程序。

if (mysql_real_connect(conn, "localhost", "username", "password", NULL, 0, NULL, 0) == NULL) {
	printf("Error %u: %s\n", mysql_errno(conn), mysql_error(conn));
	exit(1);
}

mysql_real_connect() 函数建立了一个到数据库的连接。我们提供连接对象、主机名、用户名和密码参数。其它四个参数分别是数据库名、端口、Unix 套接字和客户端标记。

if (mysql_query(conn, "CREATE DATABASE testdb")) {
	printf("Error %u: %s\n", mysql_errno(conn), mysql_error(conn));
	exit(1);
}

mysql_query() 执行一个 SQL 语句。这里创建一个新的库。

mysql_close(conn);

最后,我们关闭数据库连接。

创建和操作表
第三个实例将要创建一个表并插入一些数据。

#include <my_global.h>
#include <mysql.h>
 
int main(int argc, char * argv[])
{
	MYSQL * conn;
 
	conn = mysql_init(NULL);
	mysql_real_connect(conn, "localhsot", "username", "password", "testdb", 0, NULL, 0);
 
	mysql_query(conn, "CREATE TABLE writers(name VARCHAR(25))");
 
	mysql_query(conn, "INSERT INTO writers VALUES('Leo Tolstoy')");
	mysql_query(conn, "INSERT INTO writers VALUES('Jack London')");
	mysql_query(conn, "INSERT INTO writers VALUES('Honore de Balzac')");
	mysql_query(conn, "INSERT INTO writers VALUES('Lion Feuchtwanger')");
	mysql_query(conn, "INSERT INTO writers VALUES('Emile Zole')");
 
	mysql_close(conn);
 
	return 0;
}

我们不使用任何新的 MySQL 函数。使用 mysql_query() 函数去创建表和插入数据。

mysql_real_connect(conn, "localhost", "username", "password", "testdb", 0, NULL, 0);

我们连接数据库 testdb,用户名 username 密码 password。

mysql_query(conn, "CREATE TABLE writers(name VARCHAR(25))");

这里我们创建一个名为 writers 的表,它有一个 varchar 类型的字段。

mysql_query(conn, "INSERT INTO writers VALUES('Leo Tolstoy')");

我们在 writers 表里插入一个记录。

mysql> show tables;
+------------------+
| Tables_in_testdb |
+------------------+
| writers          |
+------------------+
1 row in set (0.00 sec)

显示数据库里的表。

mysql> select * from writers;
+-------------------+
| name              |
+-------------------+
| Leo Tolstoy       |
| Jack London       |
| Honore de Balzac  |
| Lion Feuchtwanger |
| Emile Zola        |
+-------------------+
5 rows in set (0.00 sec)

枚举表中的记录。

Over!

Leave a Reply

Your email address will not be published. Required fields are marked *