資料庫sqlite3.7.3 在PC端 和開發板arm的安裝及編譯
阿新 • • 發佈:2019-02-01
#include <stdio.h>
#include <stdlib.h>
#include "sqlite3.h"
//sqlite3的回撥函式
//sqlite 每查到一條記錄,就呼叫一次這個回撥
int LoadMyInfo( void * para, int n_column, char ** column_value, char ** column_name )
{
//para是你在 sqlite3_exec 裡傳入的 void * 引數
//通過para引數,你可以傳入一些特殊的指標(比如類指標、結構指標),然後在這裡面強制轉換成對應的型別(這裡面是void*型別,必須強制轉換成你的型別才可用)。然後操作這些資料
//n_column是這一條記錄有多少個欄位 (即這條記錄有多少列)
// char ** column_value 是個關鍵值,查出來的資料都儲存在這裡,它實際上是個1維陣列(不要以為是2維陣列),每一個元素都是一個 char * 值,是一個欄位內容(用字串來表示,以\0結尾)
//char ** column_name 跟 column_value是對應的,表示這個欄位的欄位名稱
//這裡,我不使用 para 引數。忽略它的存在.
int i;
printf( "記錄包含 %d 個欄位\n", n_column );
for( i = 0 ; i < n_column; i ++ ){
printf( "欄位名:%s ß> 欄位值:%s\n", column_name[i], column_value[i] );
}
printf( "------------------\n");
return 0;
}
int main( int argc, char **argv)
{
sqlite3 * db;
int result;
char * errmsg = NULL;
char **dbResult; //是 char ** 型別,兩個*號
int nRow, nColumn;
int i , j;
int index;
result = sqlite3_open( "mydb.db", &db );
if( result != SQLITE_OK ){
//資料庫開啟失敗
return -1;
}
//建立一個測試表,表名叫 MyTable_1,有2個欄位: ID 和 name。其中ID是一個自動增加的型別,以後insert時可以不去指定這個欄位,它會自己從0開始增加
result = sqlite3_exec( db, "create table MyTable_1( ID integer primary key autoincrement, name nvarchar(32) )", NULL, NULL, &errmsg );
if(result != SQLITE_OK ){
printf( "建立表失敗,錯誤碼:%d,錯誤原因:%s\n", result, errmsg );
}
//插入一些記錄
result = sqlite3_exec( db, "insert into MyTable_1( name ) values ( '走路' )", 0, 0, &errmsg );
if(result != SQLITE_OK ){
printf( "插入記錄失敗,錯誤碼:%d,錯誤原因:%s\n", result, errmsg );
}
result = sqlite3_exec( db, "insert into MyTable_1( name ) values ( '騎單車' )", 0, 0, &errmsg );
if(result != SQLITE_OK ){
printf( "插入記錄失敗,錯誤碼:%d,錯誤原因:%s\n", result, errmsg );
}
result = sqlite3_exec( db, "insert into MyTable_1( name ) values ( '坐汽車' )", 0, 0, &errmsg );
if(result != SQLITE_OK ){
printf( "插入記錄失敗,錯誤碼:%d,錯誤原因:%s\n", result, errmsg );
}
//開始查詢資料庫
result = sqlite3_exec( db, "select * from MyTable_1", LoadMyInfo, NULL, &errmsg );
//開始查詢,傳入的 dbResult 已經是 char **,這裡又加了一個 & 取地址符,傳遞進去的就成了 char ***
result = sqlite3_get_table( db, "select * from MyTable_1", &dbResult, &nRow, &nColumn, &errmsg );
if( SQLITE_OK == result ){
//查詢成功
index = nColumn; //前面說過 dbResult 前面第一行資料是欄位名稱,從 nColumn 索引開始才是真正的資料
printf( "查到%d條記錄\n", nRow );
for( i = 0; i < nRow ; i++ ){
printf( "第 %d 條記錄\n", i+1 );
for( j = 0 ; j < nColumn; j++ ) {
printf( "欄位名:%s ß> 欄位值:%s\n", dbResult[j], dbResult [index] );
++index;
// dbResult 的欄位值是連續的,從第0索引到第 nColumn - 1索引都是欄位名稱,從第 nColumn 索引開始,後面都是欄位值,它把一個二維的表(傳統的行列表示法)用一個扁平的形式來表示
}
printf( "-------\n" );
}
}
//到這裡,不論資料庫查詢是否成功,都釋放 char** 查詢結果,使用 sqlite 提供的功能來釋放
sqlite3_free_table( dbResult );
//關閉資料庫
sqlite3_close( db );
return 0;
}
#include <stdlib.h>
#include "sqlite3.h"
//sqlite3的回撥函式
//sqlite 每查到一條記錄,就呼叫一次這個回撥
int LoadMyInfo( void * para, int n_column, char ** column_value, char ** column_name )
{
//para是你在 sqlite3_exec 裡傳入的 void * 引數
//通過para引數,你可以傳入一些特殊的指標(比如類指標、結構指標),然後在這裡面強制轉換成對應的型別(這裡面是void*型別,必須強制轉換成你的型別才可用)。然後操作這些資料
//n_column是這一條記錄有多少個欄位 (即這條記錄有多少列)
// char ** column_value 是個關鍵值,查出來的資料都儲存在這裡,它實際上是個1維陣列(不要以為是2維陣列),每一個元素都是一個 char * 值,是一個欄位內容(用字串來表示,以\0結尾)
//char ** column_name 跟 column_value是對應的,表示這個欄位的欄位名稱
//這裡,我不使用 para 引數。忽略它的存在.
int i;
printf( "記錄包含 %d 個欄位\n", n_column );
for( i = 0 ; i < n_column; i ++ ){
printf( "欄位名:%s ß> 欄位值:%s\n", column_name[i], column_value[i] );
}
printf( "------------------\n");
return 0;
}
int main( int argc, char **argv)
{
sqlite3 * db;
int result;
char * errmsg = NULL;
char **dbResult; //是 char ** 型別,兩個*號
int nRow, nColumn;
int i , j;
int index;
result = sqlite3_open( "mydb.db", &db );
if( result != SQLITE_OK ){
//資料庫開啟失敗
return -1;
}
//建立一個測試表,表名叫 MyTable_1,有2個欄位: ID 和 name。其中ID是一個自動增加的型別,以後insert時可以不去指定這個欄位,它會自己從0開始增加
result = sqlite3_exec( db, "create table MyTable_1( ID integer primary key autoincrement, name nvarchar(32) )", NULL, NULL, &errmsg );
if(result != SQLITE_OK ){
printf( "建立表失敗,錯誤碼:%d,錯誤原因:%s\n", result, errmsg );
}
//插入一些記錄
result = sqlite3_exec( db, "insert into MyTable_1( name ) values ( '走路' )", 0, 0, &errmsg );
if(result != SQLITE_OK ){
printf( "插入記錄失敗,錯誤碼:%d,錯誤原因:%s\n", result, errmsg );
}
result = sqlite3_exec( db, "insert into MyTable_1( name ) values ( '騎單車' )", 0, 0, &errmsg );
if(result != SQLITE_OK ){
printf( "插入記錄失敗,錯誤碼:%d,錯誤原因:%s\n", result, errmsg );
}
result = sqlite3_exec( db, "insert into MyTable_1( name ) values ( '坐汽車' )", 0, 0, &errmsg );
if(result != SQLITE_OK ){
printf( "插入記錄失敗,錯誤碼:%d,錯誤原因:%s\n", result, errmsg );
}
//開始查詢資料庫
result = sqlite3_exec( db, "select * from MyTable_1", LoadMyInfo, NULL, &errmsg );
//開始查詢,傳入的 dbResult 已經是 char **,這裡又加了一個 & 取地址符,傳遞進去的就成了 char ***
result = sqlite3_get_table( db, "select * from MyTable_1", &dbResult, &nRow, &nColumn, &errmsg );
if( SQLITE_OK == result ){
//查詢成功
index = nColumn; //前面說過 dbResult 前面第一行資料是欄位名稱,從 nColumn 索引開始才是真正的資料
printf( "查到%d條記錄\n", nRow );
for( i = 0; i < nRow ; i++ ){
printf( "第 %d 條記錄\n", i+1 );
for( j = 0 ; j < nColumn; j++ ) {
printf( "欄位名:%s ß> 欄位值:%s\n", dbResult[j], dbResult [index] );
++index;
// dbResult 的欄位值是連續的,從第0索引到第 nColumn - 1索引都是欄位名稱,從第 nColumn 索引開始,後面都是欄位值,它把一個二維的表(傳統的行列表示法)用一個扁平的形式來表示
}
printf( "-------\n" );
}
}
//到這裡,不論資料庫查詢是否成功,都釋放 char** 查詢結果,使用 sqlite 提供的功能來釋放
sqlite3_free_table( dbResult );
//關閉資料庫
sqlite3_close( db );
return 0;
}