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