标签:
Linux下想要测试mysql和memcached的性能,因为是服务器只能通过终端连接,所以考虑用C语言写测试代码。于是研究了把C怎么连接MySQL以及增删改查的代码。安装mysql-client或者编译源码安装mysql后,会有支持C语言写客户端的头文件和库文件,但是目录可能不一样,mysql源码安装见 http://asyty.iteye.com/blog/1442503
从网上找了类似的代码改改后如下
连接数据库
通过gcc编译(我的mysql源码安装目录为 /usr/local/mysql)
gcc -o connect -g connect.c -I /usr/local/mysql/include/ -L /usr/local/mysql/lib/ -l mysqlclient
参数说明:-I(大写的i) 表示要连接的头文件目录,因为使用了<mysql.h> ,-L表示要连接的库文件目录 -l(小写的L) 表示要连接的具体的库名称,在/usr/local/mysql/lib/ 下,有叫做libmysqlclient.so的库,指定具体的库的名字时,默认去掉头尾的lib和.so直接使用中间的mysqlclient
如果不用-I -L ,可能导致找不到头文件 或者 函数未定义的错误
如果出现错误error while loading shared libraries,那是因为.so没有被系统载入,解决办法如下
vi /etc/ld.so.conf // 打开ld.so.conf文件,增加.so文件的路径,比如/usr/local/mysql/lib/
ldconfig //重新加载.so文件
查询代码
插入更新及删除
参考MYSQL的帮助文档整理
这里归纳了C API可使用的函数,并在下一节详细介绍了它们。请参见25.2.3节,“C API函数描述”。
| 函数 | 描述 | 
| mysql_affected_rows() | 返回上次UPDATE、DELETE或INSERT查询更改/删除/插入的行数。 | 
| mysql_autocommit() | 切换 autocommit模式,ON/OFF | 
| mysql_change_user() | 更改打开连接上的用户和数据库。 | 
| mysql_charset_name() | 返回用于连接的默认字符集的名称。 | 
| mysql_close() | 关闭服务器连接。 | 
| mysql_commit() | 提交事务。 | 
| mysql_connect() | 连接到MySQL服务器。该函数已不再被重视,使用mysql_real_connect()取代。 | 
| mysql_create_db() | 创建数据库。该函数已不再被重视,使用SQL语句CREATE DATABASE取而代之。 | 
| mysql_data_seek() | 在查询结果集中查找属性行编号。 | 
| mysql_debug() | 用给定的字符串执行DBUG_PUSH。 | 
| mysql_drop_db() | 撤销数据库。该函数已不再被重视,使用SQL语句DROP DATABASE取而代之。 | 
| mysql_dump_debug_info() | 让服务器将调试信息写入日志。 | 
| mysql_eof() | 确定是否读取了结果集的最后一行。该函数已不再被重视,可以使用mysql_errno()或mysql_error()取而代之。 | 
| mysql_errno() | 返回上次调用的MySQL函数的错误编号。 | 
| mysql_error() | 返回上次调用的MySQL函数的错误消息。 | 
| mysql_escape_string() | 为了用在SQL语句中,对特殊字符进行转义处理。 | 
| mysql_fetch_field() | 返回下一个表字段的类型。 | 
| mysql_fetch_field_direct() | 给定字段编号,返回表字段的类型。 | 
| mysql_fetch_fields() | 返回所有字段结构的数组。 | 
| mysql_fetch_lengths() | 返回当前行中所有列的长度。 | 
| mysql_fetch_row() | 从结果集中获取下一行 | 
| mysql_field_seek() | 将列光标置于指定的列。 | 
| mysql_field_count() | 返回上次执行语句的结果列的数目。 | 
| mysql_field_tell() | 返回上次mysql_fetch_field()所使用字段光标的位置。 | 
| mysql_free_result() | 释放结果集使用的内存。 | 
| mysql_get_client_info() | 以字符串形式返回客户端版本信息。 | 
| mysql_get_client_version() | 以整数形式返回客户端版本信息。 | 
| mysql_get_host_info() | 返回描述连接的字符串。 | 
| mysql_get_server_version() | 以整数形式返回服务器的版本号。 | 
| mysql_get_proto_info() | 返回连接所使用的协议版本。 | 
| mysql_get_server_info() | 返回服务器的版本号。 | 
| mysql_info() | 返回关于最近所执行查询的信息。 | 
| mysql_init() | 获取或初始化MYSQL结构。 | 
| mysql_insert_id() | 返回上一个查询为AUTO_INCREMENT列生成的ID。 | 
| mysql_kill() | 杀死给定的线程。 | 
| mysql_library_end() | 最终确定MySQL C API库。 | 
| mysql_library_init() | 初始化MySQL C API库。 | 
| mysql_list_dbs() | 返回与简单正则表达式匹配的数据库名称。 | 
| mysql_list_fields() | 返回与简单正则表达式匹配的字段名称。 | 
| mysql_list_processes() | 返回当前服务器线程的列表。 | 
| mysql_list_tables() | 返回与简单正则表达式匹配的表名。 | 
| mysql_more_results() | 检查是否还存在其他结果。 | 
| mysql_next_result() | 在多语句执行过程中返回/初始化下一个结果。 | 
| mysql_num_fields() | 返回结果集中的列数。 | 
| mysql_num_rows() | 返回结果集中的行数。 | 
| mysql_options() | 为mysql_connect()设置连接选项。 | 
| mysql_ping() | 检查与服务器的连接是否工作,如有必要重新连接。 | 
| mysql_query() | 执行指定为“以Null终结的字符串”的SQL查询。 | 
| mysql_real_connect() | 连接到MySQL服务器。 | 
| mysql_real_escape_string() | 考虑到连接的当前字符集,为了在SQL语句中使用,对字符串中的特殊字符进行转义处理。 | 
| mysql_real_query() | 执行指定为计数字符串的SQL查询。 | 
| mysql_refresh() | 刷新或复位表和高速缓冲。 | 
| mysql_reload() | 通知服务器再次加载授权表。 | 
| mysql_rollback() | 回滚事务。 | 
| mysql_row_seek() | 使用从mysql_row_tell()返回的值,查找结果集中的行偏移。 | 
| mysql_row_tell() | 返回行光标位置。 | 
| mysql_select_db() | 选择数据库。 | 
| mysql_server_end() | 最终确定嵌入式服务器库。 | 
| mysql_server_init() | 初始化嵌入式服务器库。 | 
| mysql_set_server_option() | 为连接设置选项(如多语句)。 | 
| mysql_sqlstate() | 返回关于上一个错误的SQLSTATE错误代码。 | 
| mysql_shutdown() | 关闭数据库服务器。 | 
| mysql_stat() | 以字符串形式返回服务器状态。 | 
| mysql_store_result() | 检索完整的结果集至客户端。 | 
| mysql_thread_id() | 返回当前线程ID。 | 
| mysql_thread_safe() | 如果客户端已编译为线程安全的,返回1。 | 
| mysql_use_result() | 初始化逐行的结果集检索。 | 
| mysql_warning_count() | 返回上一个SQL语句的告警数。 | 
与MySQL交互时,应用程序应使用该一般性原则:
1. 通过调用mysql_library_init(),初始化MySQL库。库可以是mysqlclient C客户端库,或mysqld嵌入式服务器库,具体情况取决于应用程序是否与“-libmysqlclient”或“-libmysqld”标志链接。
2. 通过调用mysql_init()初始化连接处理程序,并通过调用mysql_real_connect()连接到服务器。
3. 发出SQL语句并处理其结果。(在下面的讨论中,详细介绍了使用它的方法)。
4. 通过调用mysql_close(),关闭与MySQL服务器的连接。
5. 通过调用mysql_library_end(),结束MySQL库的使用。
介绍常用到的MYSQL相关的C变量类型。这些类型在我们后面定义变量的时候会用到
1、MYSQL
要连接MYSQL,必须建立MYSQL实例,通过mysql_init初始化方能开始进行连接
示例:
MYSQL mysql; #创建MYSQL实例
mysql_init(&mysql); #初始化开始进行连接
2、MYSQL_RES
这个结构代表返回行的一个查询的(SELECT, SHOW, DESCRIBE, EXPLAIN)的结果。返回的数据称为“数据集”。 从数据库读取数据,最后就是从MYSQL_RES中读取数据。
PS:类似于JAVA里面的ResultSet变量一样,将结果集存入到此变量中再从它里面去读数据。
3、MYSQL_ROW
这是一个行数据的类型安全(type-safe)的表示。当前它实现为一个计数字节的字符串数组。行通过调用mysql_fetch_row()获得
4、MYSQL_FIELD
你可以通过重复调用mysql_fetch_field()对每一列获得MYSQL_FIELD结构。这个结构包含字段信息,例如字段名、类型和大小。
PS:此变量定义的是列的相关属性问题!
示例一:实现遍历查询select * from table-name 操作
#include "windows.h"
#include "mysql.h"
#pragma comment(lib,"libmySQL.lib")
int main()
{
MYSQL mysql; //mysql连接
MYSQL_RES *res; //这个结构代表返回行的一个查询结果集
MYSQL_ROW row; //一个行数据的类型安全(type-safe)的表示
char *query; //查询语句
int t,r;
mysql_init(&mysql);
if (!mysql_real_connect(&mysql,"localhost", "root", "123", "test",3306,NULL,0))
{
printf( "Error connecting to database: %s",mysql_error(&mysql));
} else
printf("Connected...");
query="SET CHARACTER SET utf8"; //设置编码
t=mysql_real_query(&mysql,query,(unsigned int)strlen(query));
if(t)
{
printf("编码设置失败");
}
query=" select * from a ";
t=mysql_real_query(&mysql,query,(unsigned int)strlen(query));
if(t)
{
printf("执行查询时出现异常: %s",mysql_error(&mysql));
}else
printf("[%s] 构建成功",query);
res=mysql_store_result(&mysql);
while(row=mysql_fetch_row(res))
{
/*
for(t=0;t<mysql_num_fields(res);t++)
{
printf("%s" " ",row[t]);
}
*/
printf("%s",row[1]); 表示查询的第几个字段的!也还可以遍历全部字段信息
printf("\n");
}
mysql_free_result(res);
mysql_close(&mysql);
return 0;
}
示例二:执行插入、更新、删除操作
#include "windows.h"
#include "mysql.h"
#pragma comment(lib,"libmySQL.lib")
int main()
{
MYSQL mysql; //mysql连接
MYSQL_RES *res; //这个结构代表返回行的一个查询结果集
MYSQL_ROW row; //一个行数据的类型安全(type-safe)的表示
char *query; //查询语句
int t,r;
mysql_init(&mysql);
if (!mysql_real_connect(&mysql,"localhost", "root", "123", "test",3306,NULL,0))
{
printf( "Error connecting to database: %s",mysql_error(&mysql));
} else
printf("Connected...");
query="SET CHARACTER SET utf8"; //设置编码
t=mysql_real_query(&mysql,query,(unsigned int)strlen(query));
if(t)
{
printf("编码设置失败");
}
query="insert into a(name,age) values(‘w‘,9)";
t=mysql_real_query(&mysql,query,(unsigned int)strlen(query));
if(t)
{
printf("执行查询时出现异常: %s",mysql_error(&mysql));
}else
printf("[%s] 构建成功",query);
mysql_close(&mysql);
return 0;
}
标签:
原文地址:http://www.cnblogs.com/void0/p/4226938.html