我们知道,标准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,这是因为我事先给数据库的这个表插入了一条数据。

京公网安备 11010502036488号