赞
踩
程序源码地址 : https://github.com/duchenlong/linux-text/tree/master/mysql
对于不涉及到打印表格的操作,他的设计流程是这样的(插入,更新,删除数据)
而对于查找的操作,在执行sql语句后,打印表格时多了以下几个步骤
MYSQL * mysql_init(MYSQL *mysql); // 初始化一个MYSQL 连接的实例对象
所传的参数 mysql
NULL指针
,该函数将分配空间、初始化、并返回新对象的首地址。不为NULL
,那么将初始化对象,并返回该对象的首地址一般我们所传的参数为NULL,获得开辟后的mysql操作句柄
//初始化句柄
MYSQL* mysql_fd = mysql_init(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_real_connect()
尝试与运行在主机上的MySQL数据
库引擎建立连接,在执行需要有效MySQL连接句柄
结构的任何其他API函数之前,mysql_real_connect()
必须成功完成。
这个函数有多个参数,利用这些参数,需要完成和指定机器中数据库进行连接
NULL
或字符串localhost
,则假定与本地主机的连接port
不是0,其值将用作TCP/IP连接的端口号0
,也可以为下表中的数据client_flag | 功能 |
---|---|
CAN_HANDLE_EXPIRED_PASSWORDS | 客户端可以处理过期的密码 |
CLIENT_COMPRESS | 在客户端/服务器协议中使用压缩 |
CLIENT_FOUND_ROWS | 返回找到(匹配)的行数,而不是更改的行数 |
CLIENT_IGNORE_SIGPIPE | 防止客户端库安装 SIGPIPE信号处理程序。这可以用来避免与应用程序已经安装的处理程序发生冲突 |
CLIENT_IGNORE_SPACE | 在函数名称后允许空格。使所有函数名称保留字 |
CLIENT_INTERACTIVE | 在关闭连接之前,允许 interactive_timeout 闲置几秒钟(而不是 wait_timeout几秒钟)。客户端的会话wait_timeout变量设置为会话 变量的值 interactive_timeout 。 |
CLIENT_LOCAL_FILES | 启用 LOAD DATA LOCAL处理 |
CLIENT_MULTI_RESULTS | 告诉服务器客户端可以处理来自多个语句执行或存储过程的多个结果集。如果CLIENT_MULTI_STATEMENTS启用,则自动启用此标志 。有关此标志的更多信息,请参见此表后面的注释 |
CLIENT_MULTI_STATEMENTS | 告诉服务器客户端可以在单个字符串(用; 字符分隔)中发送多个语句。如果未设置此标志,则禁用多语句执行。有关此标志的更多信息,请参见此表后面的注释。 |
CLIENT_NO_SCHEMA | 不允许 db_name.tbl_name.col_name 语法 |
CLIENT_SSL | 使用SSL(加密协议)。不要在应用程序中设置此选项。它在客户端库中内部设置。而是在呼叫之前 使用 mysql_options()或 。 mysql_ssl_set()mysql_real_connect() |
CLIENT_REMEMBER_OPTIONS | 由调用指定的选项 mysql_options()。如果没有此选项,则如果 mysql_real_connect() 失败,则必须重拨 mysql_options()呼叫,然后再尝试重新连接。使用此选项, mysql_options()无需重复通话。 |
如果连接成功,返回MYSQL*连接句柄
。如果连接失败,返回NULL
。对于成功的连接,返回值与第1个参数的值相同
//建立连接
//参数依次为 数据库操作句柄 ip地址 登录用户名 密码 数据库名 端口号
// unix_socket --》 置NULL
// client_flag --》 置0
if(mysql_real_connect(mysql_fd,"127.0.0.1","root","266448",
"blog_system",3306,NULL,0) == NULL)
{
printf("连接失败,错误信息为:[%s]\n",mysql_error(mysql_fd));
return 0;
}
//设置编码格式
mysql_set_character_set(mysql_fd,"utf8");
设置数据库的编码格式,如果有汉字的话,就设置为utf8的数据格式
int mysql_query(MYSQL *mysql, const char *query)
在执行SQL语句之前,我们需要先完善该函数的第二个参数。这个参数就是需要在数据库中进行操作的指令,我们按照拼接的方式进行
void Insert(char* buf)
{
//插入数据
#define INSERT_TAG_INFO "insert into tag_blog values (%d,'%s')"
sprintf(buf,INSERT_TAG_INFO,3,"java 语言");
}
void Select(char* buf)
{
#define SELECT_TAG_INFO "select * from tag_blog;"
sprintf(buf,SELECT_TAG_INFO);
}
然后在主函数中调用该函数就可以了
char buf[1024] = {'\0'};
//Insert(buf);
Select(buf);
//执行sql语句
int ret = mysql_query(mysql_fd,buf);
if(ret < 0)
{
printf("连接失败,错误信息为:[%s]\n",mysql_error(mysql_fd));
return 0;
}
如果查询成功,返回0。如果出现错误,返回非0值
先根据操作句柄,得到数据库表格中的数据
MYSQL_RES *mysql_store_result(MYSQL *mysql)
mysql_store_result()将查询的全部结果读取到客户端,分配1个MYSQL_RES结构,并将结果置于该结构中。
如果查询未返回结果集,mysql_store_result()
将返回Null指针(例如,如果查询是INSERT语句)。
如果读取结果集失败,mysql_store_result()
还会返回Null指针。通过检查mysql_error()是否返回非空字符串,mysql_errno()
是否返回非0值,或mysql_field_count()
是否返回0,可以检查是否出现了错误。
如果未返回行,将返回空的结果集。(空结果集设置不同于作为返回值的空指针)。
//遍历查询结果
MYSQL_RES* result = mysql_store_result(mysql_fd);
if(result == NULL)
{
printf("查询失败,错误信息为:[%s]\n",mysql_error(mysql_fd));
return 0;
}
得到数据库表格的行数,和列数
//获取行数和列数
int row = mysql_num_rows(result);
int col = mysql_num_fields(result);
进行结果遍历,与释放结果集
//打印结果
for(int i = 0; i < row; i++)
{
MYSQL_ROW r = mysql_fetch_row(result);
for(int j = 0; j < col; j++)
printf("%s\t",r[j]);
printf("\n");
}
//释放结果集
mysql_free_result(result);
void mysql_close(MYSQL *mysql)
关闭前面打开的连接。如果句柄是由mysql_init()或mysql_connect()
自动分配的,mysql_close()
还将解除分配由mysql指向的连接句柄。
mysql_close(mysql_fd);
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。