linux c++ sqlite3

1,基本信息:sql

1)#include <sqlite3.h>數據庫

2)int rc = sqlite3_open(db_name, &db);//不存在會建立文件macos

3)查詢後直接返回結果 而不是回調函數

int
sqlite3_get_table (sqlite3 *,   // 打開的數據庫對象指針
                   const char * sql, // 要查詢的 sql 語句
                   char *** resultp, // 查詢結果
                   int * nrow,   // 查詢出多少條記錄(即查出多少行)
                   int * ncolumn, // 多少個字段(多少列)
                   char ** errmsg  // 錯誤信息
);
工具


4)sqlite3_close(sqlite3 *db);測試

5)sqlite3_exec(sqlite3*, const char *sql, int (*callback)(void*,int,char**,char**),  void *, char **errmsg);編碼

int
sqlite3_exec ( sqlite3 *db,  // 使用 sqlite3_open () 打開的數據庫對象。
               const char *sql, // 一條待查詢的 SQL 語句
               sqlite3_callback, // 自定義的回調函數,對查詢結果每一行都執行一次這個函數
               void *,// 這個void 會直接傳遞到 callback 中的 void 位置;
               char **errmsg//出錯信心 能夠爲空
);
spa


其中sqlite3_callback 是一個 函數指針;指針

定義爲:調試

typedef int
(*sqlite3_callback) (void *, // 這就是上面函數傳遞的 void * 參數,須要強制類型轉換後才能使用。
                    int, // 查詢結果的列數,即有多少個字段數
                    char **, // 保存查詢結果
                    char **  // 各個字段的名字
);




6)sqlite3_free_table( dbResult );


2, 對於查詢數據 能夠使用getTable 也能夠使用回調方式的 execute;


3,獲取數據庫中的表名: 注意 一個db 文件中可能包含多個table(方法待驗證)

char  *szError = NULL,**dbResult;
int  row,col;
int  result = sqlite3_get_table( db, "SELECT name FROM sqlite_master WHERE type='table' ORDER BY name" ,&dbResult,&row,&col,&szError );
if ( result == SQLITE_OK )
{
     //dbResult就是查詢結果,row和col分別是返回結果集的行數(包含表頭)和列數
     sqlite3_free_table(dbResult);
}
else
{
     //szError是錯誤描述信息
     sqlite3_free(szError);
}


4,查詢 表中 的 字段名; 已經驗證; 網上查到的方法 都存在一些問題,好比當 表 內容爲空時,查詢字段名稱失敗;仍是經過查看官方文檔解決了問題;

sql = "select * from table_name";
    //預處理
    rc = sqlite3_prepare(db, sql, (int)strlen(sql), &stmt, &tail);

    if(rc != SQLITE_OK) {
        fprintf(stderr, "SQL error: %s\n", sqlite3_errmsg(db));
    }
    
    //rc = sqlite3_step(stmt); [親測: no need to step]
    ncols = sqlite3_column_count(stmt);//[tested , got  real count]

    
        //[tested , colum names are printed out]
        for(i=0; i < ncols; i++) {
            fprintf(stderr, "'%s' ", sqlite3_column_text(stmt, i));
        }

        fprintf(stderr, "\n");

        
    
    //釋放statement
    sqlite3_finalize(stmt);
    //關閉數據庫
  //  sqlite3_close(db); [you can choose not to close]

    return 0;   


5,運行階段: 環境 macos  XCode ;

編譯直接報錯;各類sqlite3 函數找不到

猜想是編譯連接問題; 果斷導入 sqlite3包後 編譯成功;


6,剛纔(PM 10:31  ,2015.03.16;) 封裝的sqlite 工具庫 已經調試完成; 插入,刪除,更新數據,打印數據都已經成功;

可是目前仍是有一點困惑:

1)字段中存在 integer 類型;

2)查詢返回值中返回的類型 是 char**

3) 插入語句是 insert into tb_name values ( 5 , 788 , "stt"); 這條語句是 存儲在char[]

那麼問題來了:

integer 5, 寫入到char[]中時候 應該怎麼寫?

a) 我先使用 int* 磚 char* 方式 ,仍然佔用4 個字節 拷貝進來 ,可是 sqlite 報錯;

b) 使用int 轉字符串 即 5 轉爲 ‘5’, 方式, 工做正常;

問題是: 我一直認爲 在bd 中 的integer 存儲的 integer 字段 , 使用的是 如 int 類型 在內存中同樣;例如1 ,應當佔4個字節,而不是如‘1’ 只佔了一個字節;

還請指正我錯誤的地方。

謝謝;

通過測試,我推測:在查詢語句中 的integer 仍然應當使用 相應的ASC碼值,而在數據庫文件中 仍然將採用整型 數據格式存儲。應當是 sqlite 內部對這個作了次封裝處理;



NULL: 這個值爲空值

VARCHAR(n):長度不固定且其最大長度爲 n 的字串,n不能超過 4000。

CHAR(n):長度固定爲n的字串,n不能超過 254。

INTEGER: 值被標識爲整數,依據值的大小能夠依次被存儲爲1,2,3,4,5,6,7,8.

REAL: 全部值都是浮動的數值,被存儲爲8字節的IEEE浮動標記序號.

TEXT: 值爲文本字符串,使用數據庫編碼存儲(TUTF-8, UTF-16BE or UTF-16-LE).

BLOB: 值是BLOB數據塊,以輸入的數據格式進行存儲。如何輸入就如何存儲,不改  變格式。

DATA :包含了 年份、月份、日期。

TIME: 包含了 小時、分鐘、秒。

相關文章
相關標籤/搜索