嵌入式SQL
我們知道,標(biāo)準(zhǔn)SQL是非過程化的查詢語言,具有操作統(tǒng)一,面向集合,功能豐富,使用簡單等多項(xiàng)優(yōu)點(diǎn)。但和程序設(shè)計(jì)語言相比,高度非過程化的優(yōu)點(diǎn)也造就了它的一個(gè)缺點(diǎn):缺少流程控制能力,難以實(shí)現(xiàn)應(yīng)用業(yè)務(wù)中的邏輯控制。
------摘自《數(shù)據(jù)庫系統(tǒng)概論》(王珊,薩師煊 編著)
將SQL語句嵌入到高級(jí)語言中混合編程,SQL語句負(fù)責(zé)操縱數(shù)據(jù)庫,高級(jí)語言語句負(fù)責(zé)控制邏輯流程。
1.兩種語言之間的通信。
a.SQL通信區(qū):向宿主語言(這里是C語言)傳遞SQL語句的執(zhí)行狀態(tài)信息。SQLCODE變量 執(zhí)行成功為SUCCESS,否則為錯(cuò)誤代碼
b.主變量:宿主語言向SQL語句提供參數(shù)
c.主變量和游標(biāo):將SQL語句查詢數(shù)據(jù)庫的結(jié)果交給宿主語言處理。
下面來一個(gè)數(shù)據(jù)庫查詢的例子:
#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,其參數(shù)依次為MYSQL句柄。serverIP地址。 登錄mysql的username,password,要連接的數(shù)據(jù)庫等*/ if(!mysql_real_connect(&mysql, "localhost", "root", "自己的密碼", "自己的數(shù)據(jù)庫", 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講所有的查詢結(jié)果讀取到client*/ res = mysql_store_result(&mysql); /*mysql_fetch_row檢索結(jié)果集的下一行*/ while(row = mysql_fetch_row(res)) { /*mysql_num_fields返回結(jié)果集中的字段數(shù)目*/ for(t=0; t<mysql_num_fields(res); t++) { printf("%s\t", row[t]); } printf("\n"); } /*關(guān)閉連接*/ mysql_close(&mysql); return 0; }
我們可以看到,這些代碼里面沒有直接使用嵌入式SQL,因?yàn)镸ySQL已經(jīng)為我們封裝好了一些函數(shù),來進(jìn)行數(shù)據(jù)的連接,執(zhí)行SQL語句等等,對(duì)這些封裝函數(shù)感興趣的可以查看這篇博客:
鏈接:https://www.cnblogs.com/clnchanpin/p/6731515.html
編譯的時(shí)候要注意:
1.如果報(bào)錯(cuò)說找不到mysql.h頭文件,可能真的沒有,需要安裝一下,如下圖:使用mysql_config命令查看各種庫的位置等,如果沒有這個(gè)命令(程序),就需要根據(jù)提示安裝。
上圖:
2.編譯的時(shí)候加上這些庫,比如我的編譯命令:
g++ -o insetSQL_test insetSQL_test.cpp -I /usr/include/mysql -L /usr/lib64/mysql -lmysqlclient
這些庫的位置是通過剛才那個(gè)命令得知的:
mysql_config
上圖:
最后來看程序執(zhí)行結(jié)果:
可以看到把查詢結(jié)果顯示出來了,jason 1,這是因?yàn)槲沂孪冉o數(shù)據(jù)庫的這個(gè)表插入了一條數(shù)據(jù)。