我们知道,标准SQL是非过程化的查询语言,具有操作统一,面向集合,功能丰富,使用简单等多项优点。但和程序设计语言相比,高度非过程化的优点也造就了它的一个缺点:缺少流程控制能力,难以实现应用业务中的逻辑控制。
------摘自《数据库系统概论》(王珊,萨师煊 编著)
将SQL语句嵌入到高级语言中混合编程,SQL语句负责操纵数据库,高级语言语句负责控制逻辑流程。
1.两种语言之间的通信。
a.SQL通信区:向宿主语言(这里是C语言)传递SQL语句的执行状态信息。SQLCODE变量 执行成功为SUCCESS,否则为错误代码
b.主变量:宿主语言向SQL语句提供参数
c.主变量和游标:将SQL语句查询数据库的结果交给宿主语言处理。
下面来一个数据库查询的例子:
#include <stdio.h> #include <string.h> #include <mysql.h> int main() { MYSQL mysql; MYSQL_RES *res; MYSQL_ROW row; int flag, t; /*连接之前。先用mysql_init初始化MYSQL连接句柄*/ mysql_init(&mysql); /*使用mysql_real_connect连接server,其參数依次为MYSQL句柄。serverIP地址。 登录mysql的username,password,要连接的数据库等*/ if(!mysql_real_connect(&mysql, "localhost", "root", "自己的密码", "自己的数据库", 0, NULL, 0)) printf("Error connecting to Mysql!\n"); else printf("Connected Mysql successful!\n"); char query[] = "select * from log"; /*查询,成功则返回0*/ flag = mysql_real_query(&mysql, query, (unsigned int)strlen(query)); if(flag) { printf("Query failed!\n"); return 0; }else { printf("[%s] made...\n", query); } /*mysql_store_result讲所有的查询结果读取到client*/ res = mysql_store_result(&mysql); /*mysql_fetch_row检索结果集的下一行*/ while(row = mysql_fetch_row(res)) { /*mysql_num_fields返回结果集中的字段数目*/ for(t=0; t<mysql_num_fields(res); t++) { printf("%s\t", row[t]); } printf("\n"); } /*关闭连接*/ mysql_close(&mysql); return 0; }
我们可以看到,这些代码里面没有直接使用嵌入式SQL,因为MySQL已经为我们封装好了一些函数,来进行数据的连接,执行SQL语句等等,对这些封装函数感兴趣的可以查看这篇博客:
链接:https://www.cnblogs.com/clnchanpin/p/6731515.html
编译的时候要注意:
1.如果报错说找不到mysql.h头文件,可能真的没有,需要安装一下,如下图:使用mysql_config命令查看各种库的位置等,如果没有这个命令(程序),就需要根据提示安装。
上图:
2.编译的时候加上这些库,比如我的编译命令:
g++ -o insetSQL_test insetSQL_test.cpp -I /usr/include/mysql -L /usr/lib64/mysql -lmysqlclient
这些库的位置是通过刚才那个命令得知的:
mysql_config
上图:
最后来看程序执行结果:
可以看到把查询结果显示出来了,jason 1,这是因为我事先给数据库的这个表插入了一条数据。