1. 程式人生 > >sqlite3例項程式碼及遇到的問題

sqlite3例項程式碼及遇到的問題

#include <stdio.h>
#include <sqlite3.h>
static int callback(void *NotUsed, int argc, char **argv, char **azColName)
{
    int i;
    for(i=0; i<argc; i++){
       printf("%s = %s\n", azColName[i], argv[i] ? argv[i] : "NULL");
    }
    printf("\n");
    return 0;
}
#define CHECK_RC(rc,szInfo,szErrMsg,db) if(rc!=SQLITE_OK)\
           {printf("%s error!/n",szInfo);\
           printf("%s/n",szErrMsg);\
           sqlite3_free(szErrMsg);\
           sqlite3_close(db);\
           return 0;}
int main(int argc, char * argv[])
{
 
    sqlite3 *db;
    char *dbPath="test.db";
    char *szErrMsg = 0;
 
    int rc= sqlite3_open(dbPath, &db);

    //CHECK_RC(rc,"open database",db);

    char *szSql="create table UserInfo(ID int primary key , UserName char, PassWord char);";
    rc=sqlite3_exec(db,szSql,0,0,&szErrMsg);
    CHECK_RC(rc,"create table",szErrMsg,db);
    rc=sqlite3_exec(db,"insert into UserInfo(ID,UserName,PassWord) values(1,'kfqcome','123456')",0,0,&szErrMsg);
    CHECK_RC(rc,"insert info",szErrMsg,db);
    rc=sqlite3_exec(db,"insert into UserInfo(ID,UserName,PassWord) values(2,'miss wang','654321')",0,0,&szErrMsg);
    CHECK_RC(rc,"insert info",szErrMsg,db);
    szSql="select * from UserInfo";
    rc = sqlite3_exec(db,szSql, callback, 0, &szErrMsg);
    CHECK_RC(rc,"query values",szErrMsg,db);
    sqlite3_close(db);
    getchar();
    return 0;

}

輸出的結果:

ID = 1

UserName = kfqcome

PassWord = 123456

 

ID = 2

UserName = miss wang

PassWord = 654321

這裡執行sql語句用的是sqlite3_exec,它是前面幾個函式的封裝

 

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 */

);

sqlite3_exec是sqlite3_prepare_v2,sqlite3_step()和sqlite3_finalize()的封裝,能讓程式多次執行sql語句而不要寫許多重複的程式碼。

Sqlite3_exec介面執行0或多個UTF-8編碼的,分號分割的sql語句,傳到第二個引數中。如果sqlite3_exec的第三個引數回撥函式指標不為空,那麼它會為每個來自執行的SQL語句的結果行呼叫(也就是說回撥函式會呼叫多次,上面例子中會返回2個結果行,因而會被執行2次),第4個引數是傳給回撥函式的第一個引數,如果回撥函式指標為空,那麼回撥不會發生同時結果行被忽略。

如果在執行sql語句中有錯誤發生,那麼當前的語句的執行被停止,後續的語句也被跳過。第五個引數不為空的時候,它被分配記憶體並寫入了錯誤資訊,所以在sqlite3_exec後面需要呼叫sqlite3_free去釋放這個物件以防止記憶體洩露

 

回撥函式:

int (*callback)(void*,int,char**,char**),  /* Callback function */

         第一個引數通過sqlite3_exec的第第四個引數傳入的

         第二個引數是結果行的列數

         第三個引數是行中列資料的指標

         第四個引數是行中列名稱的指標
 

Sqlite3的安裝
安裝使用資料庫系統Sqlite3
安裝資料庫系統Sqlite3:
apt-get install sqlite sqlite3
檢查資料庫安裝結果:
sqlite3 test.db
.database
.exit
提供下面的命令我們應該可以看到檔案test.db。
ls
安裝Sqlite3編譯需要的工具包:
apt-get install libsqlite3-dev

安裝視覺化工具
sudo apt-get install sqlitebrowser

找不到庫檔案的解決方法:

/tmp/ccH7jM5Y.o: In function `main':
/tmp/ccH7jM5Y.o(.text+0xd5): undefined reference to `sqlite3_open'
/tmp/ccH7jM5Y.o(.text+0xf2): undefined reference to `sqlite3_errmsg'
/tmp/ccH7jM5Y.o(.text+0x117): undefined reference to `sqlite3_close'
/tmp/ccH7jM5Y.o(.text+0x14c): undefined reference to `sqlite3_exec'
/tmp/ccH7jM5Y.o(.text+0x180): undefined reference to `sqlite3_close'

find . -name *****

 gcc testsql3_1.c -L/usr/lib/ -lsqlite3
注意L和l,L制定絕對路徑,l自動查詢

相關推薦

sqlite3例項程式碼遇到的問題

#include <stdio.h> #include <sqlite3.h> static int callback(void *NotUsed, int argc, char **argv, char **azColName) {     int

ajax例項程式碼效果

ps:不足之處,請大家多多指教 以下html檔案都要伺服器環境下開啟。 <!DOCTYPE html> <html lang="en"> <head>

Java RMI特性例項程式碼

RMI (Remote Method Invocation) 1,RMI 採用stubs 和 skeletons 來進行遠端物件(remote object)的通訊。stub 充當遠端物件的客戶端代理,有著和遠端物件相同的遠端介面,遠端物件的呼叫實際是通過呼叫該物件的客戶端代理物件stub來

Qt5佈局管理例項(含程式碼簡介)

一、例項效果                                                       (a)“基本資訊頁面”                                                        (b)"

Spark MLlib 貝葉斯分類演算法例項具體程式碼執行過程詳解

import org.apache.log4j.{Level, Logger} import org.apache.spark.{SparkConf, SparkContext} import org.apache.spark.mllib.classification.{NaiveBayes, Naiv

php rabbitmq操作類生產者和消費者例項程式碼

注意事項: 1、accept.php消費者程式碼需要在命令列執行 2、'username'=>'asdf','password'=>'123456' 改成自己的帳號和密碼 RabbitMQCommand.php操作類程式碼 <?php /* * am

roc曲線簡單介紹例項程式碼

今日筆記:roc曲線 還是僅供自己參考學習。。 首先要注意的是roc曲線僅適用於二分類問題,不是二分類問題應首先通過各種手段轉為二分類問題。 roc橫座標為TPR,縱座標為TPR,若要知道TPR,FPR,就要從混淆矩陣說起... 漏掉了f1..f1 = 2*p*r

k最鄰近演算法-KNN,python3 例項程式碼

剛讀了《machine learning in action》的KNN演算法。 K最近鄰演算法(kNN,k-NearestNeighbo),即計算到每個樣本的距離,選取前k個。從前k個選擇出大多數屬於的class來進行分類,以下特點: 1. 簡單,無需訓練 2. 樣本數量不

gson java物件與json轉換(例項程式碼說明教程)

java物件轉json public class MsgInfo2 { private String message; private String flag; public String

資料探勘之clara演算法原理例項(程式碼中有bug)

繼上兩篇文章介紹聚類中基於劃分思想的k-means演算法和k-mediod演算法 本文將繼續介紹另外一種基於劃分思想的k-mediod演算法-----clara演算法 clara演算法可以說是對k-mediod演算法的一種改進,就如同k-mediod演算法對 k-m

Java 執行緒池詳解例項程式碼

這篇文章主要介紹了Java 執行緒池的相關資料,並符例項程式碼,幫助大家學習參考,需要的朋友可以參考下執行緒池的技術背景在面向物件程式設計中,建立和銷燬物件是很費時間的,因為建立一個物件要獲取記憶體資源或者其它更多資源。在Java中更是如此,虛擬機器將試圖跟蹤每一個物件,以便

Xcode9.0+appium1.6.5真機環境運行app坑知多少

xc0de9.0 appium1.6.5 真機測試app ios app真機測試 ios app自動化測試 Mac下把appium自動化環境搭建好後,進行真機測試時會碰到相當多的坑, 下面給大家一一列出來並附上解決方法。 一、selenium.common.exceptions.WebDr

VPN無法連線,VPN連線錯誤程式碼解決方案

  VPN無法連線是大家經常遇到的問題.連線不上VPN一般都會提示一些錯誤程式碼.其實我們可以通過這些錯誤程式碼來解決一些簡單的問題.   本篇文章會給大家簡單的介紹幾個常見的VPN錯誤程式碼以及對應的解決方案.這裡錯誤程式碼解決方案會時時更新.   807錯誤–無法連線到伺服器.請檢查你連

通俗易懂的Adaboost演算法原理分析和例項+程式碼

   【尊重原創,轉載請註明出處】 http://blog.csdn.net/guyuealian/article/details/70995333     本人最初瞭解AdaBoost演算法著實是花了幾天時間,才明白他的基本原理。也許是自己能力有限吧,很多資

LwIP例項程式碼分析

//開發環境IAR int APP_Main(void) { #if C_USE_MCU_STM32F4xx  /* Ethernet configuration --------------------------------------*/ Ethernet_Initial(); w

RF工具自定義linux命令列命令執行程式碼資料庫訪問

之前寫了幾次資料庫連線和linux命令列執行的程式碼,在此儲存下。 另考慮到python2的中文編碼問題,註釋等都用簡單英文,見諒~  import paramiko class Excsshcmd(): ssh = paramiko.SSHClient()

Java IO 程式設計(BIO、NIO、AIO完整例項程式碼

      本文會從傳統的BIO到NIO再到AIO自淺至深介紹,並附上程式碼講解。   原始碼地址: https://github.com/kkman2008/java-IO.git     下面程式碼中會使用這樣一個

C語言實現魔方陣程式碼解析

問題描述編寫程式,實現如下表所示的5-魔方陣。 17 24 1 8 15 23 5 7 14 16 4 6 13 20 22

Git------的使用管理程式碼上傳gitHub

  這次課程的視訊連結(B站) 傳送門:https://www.bilibili.com/video/av17183591/?p=1 共五集 核心程式碼 下載程式碼 git clone [email protected]:lenvo222/L

小程式實現上拉載入,例項程式碼

小程式實現上拉載入,例項程式碼 最近在做一個小程式,想實現下拉重新整理的功能,剛開始就遇到了一個尷尬的問題,原因是不認真o(╥﹏╥)o 下面是通過摸索總結出的步驟,給尋找問題的同伴提供參考: 下拉重新整理分為全域性和單頁面的: 全域性的設定就是在 app.js 中的 Windows