使用C語言操作sqlite3
1.對數據庫打開操作:
SQLITE_API int sqlite3_open(
const char *filename, /* Database filename (UTF-8) */
sqlite3 **ppDb /* OUT: SQLite db handle */
);
參數 :
你要打開的文件名,文件名是一個字符串,需要" "
數據庫句柄的地址(指針)
以上函數表示的就是打開這個數據庫文件,放入到句柄的中
因為你傳遞的參數是句柄的地址,因此我可以改變句柄的內容
返回值:
如果當前的函數成功運行,就會返回一個SQLITE_OK
編寫代碼之前我們需要進行一些準備工作:
1.需要保證當前的文件夾內有一個sqlite3.c 和sqlite3.h這兩個文件
這個時候你就可以敲代碼了
#include <stdio.h> #include "sqlite3.h"//包含數據庫函數所在的頭文件 //因為sqlite3.c和.h都與當前文件為同一文件夾因此使用"" int main(int argc, char const *argv[]) { sqlite3*db;//創建一個數據庫句柄db int ret = sqlite3_open("haha.db",&db); //ret就是用來接返回值,如果函數正確的運行返回值就是 //SQLITE_OK if (ret !=SQLITE_OK) { printf("數據庫打開出錯\n"); } else printf("數據庫打開成功\n"); return 0; }
2.對數據庫關閉操作
SQLITE_API int sqlite3_close(sqlite3*);
參數:
數據庫句柄db
返回值:
如果當前的函數成功運行,就會返回一個SQLITE_OK
編寫代碼:
#include <stdio.h> #include "sqlite3.h"//包含數據庫函數所在的頭文件 //因為sqlite3.c和.h都與當前文件為同一文件夾因此使用"" int main(int argc, char const *argv[]) { sqlite3*db;//創建一個數據庫句柄db int ret = sqlite3_open("haha.db",&db); //ret就是用來接返回值,如果函數正確的運行返回值就是 //SQLITE_OK if (ret !=SQLITE_OK) { printf("數據庫打開出錯\n"); } else printf("數據庫打開成功\n"); ret = sqlite3_close(db); if (ret !=SQLITE_OK) { printf("數據庫關閉出錯\n"); } else printf("數據關閉成功\n"); return 0; }
3.對數據庫寫操作
SQLITE_API int sqlite3_exec(
sqlite3*, /* An open database */
const char *sql, /* SQL to be evaluated */
int (*callback)(void*,int,char**,char**), /* Callback function */
void *, /* 1st argument to callback */
char **errmsg /* Error msg written here */
);
參數:
打開的數據庫句柄
sql語句字符串
同時調用的函數名稱 一般寫NULL
傳遞給函數的參數 一般寫NULL
錯誤信息的存儲位置
返回值:
如果當前的函數成功運行,就會返回一個SQLITE_OK
代碼編寫:
#include <stdio.h> #include "sqlite3.h"//包含數據庫函數所在的頭文件 //因為sqlite3.c和.h都與當前文件為同一文件夾因此使用"" int main(int argc, char const *argv[]) { sqlite3*db;//創建一個數據庫句柄db int ret = sqlite3_open("haha.db",&db);//---------------打開 //ret就是用來接返回值,如果函數正確的運行返回值就是 //SQLITE_OK if (ret !=SQLITE_OK) { printf("數據庫打開出錯\n"); } else printf("數據庫打開成功\n"); // 1.思考自己要做的操作:新建一個表 // 2.寫一個創建表的sql語句 char *cmd = "create table persons (id int ,name text);"; // 3.看自己是讀操作還是寫操作 // 如果是寫操作就使用sqlite3_exec // 如果是讀操作就使用sqlite3_get_table // 4.調用就行了 char *errmsg = NULL; sqlite3_exec(db,cmd,NULL,NULL,&errmsg); ret = sqlite3_close(db);//-------------------------------關閉 if (ret !=SQLITE_OK) { printf("數據庫關閉出錯\n"); } else printf("數據關閉成功\n"); return 0; } //編譯gcc xxx.c sqlite3.c -lpthread -ldl
4.對數據庫讀操作
SQLITE_API int sqlite3_get_table(
sqlite3 *db, /* An open database */
const char *zSql, /* SQL to be evaluated */
char ***pazResult, /* Results of the query */
int *pnRow, /* Number of result rows written here */
int *pnColumn, /* Number of result columns written here */
char **pzErrmsg /* Error msg written here */
);
參數:
你打開的數據庫句柄 --------也就是你要對哪個數據庫進行讀操作;
你要進行讀操作的SQL語句(查)
查詢到的結果集表的地址
你查到的結果集表的行數(查詢到的數據行數)
你查到的結果集表的列數(查詢到的數據列數)
錯誤信息
返回值:
如果當前的函數成功運行,就會返回一個SQLITE_OK
寫操作:
#include <stdio.h>
#include "sqlite3.h"
int main()
{
//打開數據庫
sqlite3 *db;//操作數據庫的句柄
int ret = sqlite3_open("./my.db",&db);
if(ret != SQLITE_OK)
{
printf("沒有打開成功\n");
}
//通過一個API來執行 想要執行的命令
//char cmd[256]="insert into person values(10,\"hehe\");";
char *errmsg=NULL;
char name[256]="";
int id=0;
char cmd[256]="";
while(1)
{
//讓用戶輸入
scanf("%d %s",&id,name);
if(id == -1)
{
break;
}
sprintf(cmd,"insert into person values(%d,\"%s\");",id,name);
sqlite3_exec(db,cmd,NULL,NULL,&errmsg);//執行sql語句
if(errmsg != NULL)
{
printf("%s\n",errmsg);
break;
}
}
sqlite3_close(db);
return 0;
}
讀操作:
#include <stdio.h>
#include "sqlite3.h"
int main(int argc, char *argv[])
{
//打開數據庫
sqlite3 *db=NULL;
int ret = sqlite3_open("./my.db",&db);
if(ret != SQLITE_OK)
{
printf("打開數據庫失敗\n");
return 0;
}
//讀取數據庫
char **table =NULL;
char *err=NULL;
int row=0;
int col=0;
char cmd[256]="select * from person;";
sqlite3_get_table(db,cmd,&table,&row,&col,&err);
if(err != NULL)
{
printf("%s\n",err);
}
//打印出 查詢到的內容
//10 hehe
//20 heihei
int i=0;
for(i=0;i<row;i++)
{
int j=0;
for(j=0;j<col;j++)
{
printf("%s ",table[i*col+j]);
}
printf("\n");
}
//關閉數據庫
sqlite3_close(db);
return 0;
}
智能推薦
sqlite3數據庫C語言簡單操作基礎之數據的增刪改(二)
轉載至:https://blog.csdn.net/dancer__sky/article/details/79041587 概述:前面記錄了sqlite3數據庫c接口的一些基礎API的功能介紹以及數據庫文件創建及表的創建,今天主要就是記錄一下數據庫數據的增刪改,為啥這里沒說查,后面會單獨做一個查的筆記。畢竟查可能就有點不一樣了,它是有返回值的,所以就分類到下次記錄吧。 1,插入數據 主要還是看s...
Sqlite3 stmt 機制操作
參考文獻:https://blog.csdn.net/u012351051/category_8966045.html sqlite 提供了SQL語句執行的函數sqlite3_exec,本文介紹的是sqlite3_stmt方式對數據庫進行操作。 官方文檔以及參考資料中給出的...
freemarker + ItextRender 根據模板生成PDF文件
1. 制作模板 2. 獲取模板,并將所獲取的數據加載生成html文件 2. 生成PDF文件 其中由兩個地方需要注意,都是關于獲取文件路徑的問題,由于項目部署的時候是打包成jar包形式,所以在開發過程中時直接安照傳統的獲取方法沒有一點文件,但是當打包后部署,總是出錯。于是參考網上文章,先將文件讀出來到項目的臨時目錄下,然后再按正常方式加載該臨時文件; 還有一個問題至今沒有解決,就是關于生成PDF文件...
電腦空間不夠了?教你一個小秒招快速清理 Docker 占用的磁盤空間!
Docker 很占用空間,每當我們運行容器、拉取鏡像、部署應用、構建自己的鏡像時,我們的磁盤空間會被大量占用。 如果你也被這個問題所困擾,咱們就一起看一下 Docker 是如何使用磁盤空間的,以及如何回收。 docker 占用的空間可以通過下面的命令查看: TYPE 列出了docker 使用磁盤的 4 種類型: Images:所有鏡像占用的空間,包括拉取下來的鏡像,和本地構建的。 Con...
猜你喜歡
requests實現全自動PPT模板
http://www.1ppt.com/moban/ 可以免費的下載PPT模板,當然如果要人工一個個下,還是挺麻煩的,我們可以利用requests輕松下載 訪問這個主頁,我們可以看到下面的樣式 點每一個PPT模板的圖片,我們可以進入到詳細的信息頁面,翻到下面,我們可以看到對應的下載地址 點擊這個下載的按鈕,我們便可以下載對應的PPT壓縮包 那我們就開始做吧 首先,查看網頁的源代碼,我們可以看到每一...
Linux C系統編程-線程互斥鎖(四)
互斥鎖 互斥鎖也是屬于線程之間處理同步互斥方式,有上鎖/解鎖兩種狀態。 互斥鎖函數接口 1)初始化互斥鎖 pthread_mutex_init() man 3 pthread_mutex_init (找不到的情況下首先 sudo apt-get install glibc-doc sudo apt-get install manpages-posix-dev) 動態初始化 int pthread_...
統計學習方法 - 樸素貝葉斯
引入問題:一機器在良好狀態生產合格產品幾率是 90%,在故障狀態生產合格產品幾率是 30%,機器良好的概率是 75%。若一日第一件產品是合格品,那么此日機器良好的概率是多少。 貝葉斯模型 生成模型與判別模型 判別模型,即要判斷這個東西到底是哪一類,也就是要求y,那就用給定的x去預測。 生成模型,是要生成一個模型,那就是誰根據什么生成了模型,誰就是類別y,根據的內容就是x 以上述例子,判斷一個生產出...
styled-components —— React 中的 CSS 最佳實踐
https://zhuanlan.zhihu.com/p/29344146 Styled-components 是目前 React 樣式方案中最受關注的一種,它既具備了 css-in-js 的模塊化與參數化優點,又完全使用CSS的書寫習慣,不會引起額外的學習成本。本文是 styled-components 作者之一 Max Stoiber 所寫,首先總結了前端組件化樣式中的最佳實踐原則,然后在此基...