ocean2811
7/5/2018 - 3:04 AM

MySQL的C/C++编程API

MySQL数据库的C/C++编程API

单一文件包含了select/update等操作,使用时需要手动分离

//执行查询或表操作(update...)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <mysql.h>

int main()
{
	//mysql初始化
	MYSQL *mysql = mysql_init(NULL);
	if(mysql==NULL)
	{
		//初始化失败处理
	}
	//连接数据库
	//MYSQL *mysql_real_connect(MYSQL *mysql, const char *host, const char *user, const char *passwd, const char *db, unsigned int port, const char *unix_socket, unsigned long client_flag) 
	MYSQL *conn = mysql_real_connect(mysql, "localhost", "root", "123456", "scott", 0, NULL, 0);
	if(conn==NULL)
	{
		//连接数据库失败处理
	}

	//获取当前使用的字符集
	printf("before:[%s]\n", mysql_character_set_name(conn));
	//设置字符集
	mysql_set_character_set(conn, "utf8");
	printf("after:[%s]\n", mysql_character_set_name(conn));

	//执行sql语句
	char sql[] = "select * from dept";
	int ret = mysql_query(conn, sql); 
	if (ret!=0)
	{
		// 执行sql语句error
	}
	else // query succeeded, process any data returned by it
	{
		result = mysql_store_result(&mysql);
		if (result!=NULL)  // 有需要返回的结果集
		{
			//获取结果集中每一行的列数
			//int num = mysql_field_count(conn);
			int num = mysql_num_fields(results);

			//获取表头的列名
			MYSQL_FIELD *fields = mysql_fetch_fields(results);
			if(fields==NULL)
			{
				//获取表头的列名失败处理...
			}
			//循环打印表头
			for(i=0; i<num; i++)
			{
				printf("%s ", fields[i].name);
			}
			printf("\n");

			//获取结果集中的每一行记录
			MYSQL_ROW row;
			while(row=mysql_fetch_row(results))
			{
				for(i=0; i<num; i++)
				{
					printf("%s ", row[i]);
				}	
				printf("\n");
			}

			//释放结果集
			mysql_free_result(results);
		}
		else  //没有需要返回的结果集或mysql_store_result出错
		{
			if(mysql_field_count(&mysql) == 0)
			{
				// query does not return data
				// (it was not a SELECT)
				//没有需要返回的结果集,但可以获得影响的行数
				num_rows = mysql_affected_rows(&mysql);
			}
			else // mysql_store_result() 出错
			{
				fprintf(stderr, "Error: %s\n", mysql_error(&mysql));
			}
		}
	}
	
	//关闭数据库连接
	mysql_close(conn);

	return 0;
}