天天看點

linux 下sqlite 程式設計入門全攻略

******************************************************************
--------------部分操作--------------
建資料庫:
[email protected]:~$ sqlite3 my.db
檢視幫助:
sqlite> .help
檔案存放位置:
sqlite> .database
退出:
sqlite> .quit
檢視表:
sqlite> .tables
顯示表的結構:
sqlite> .schema
*******************************************************************
---------------文法------------------
1.建表:
sqlite> create table usr(id integer primary key, name text,age integer null, gender text, salary real not null); 
注意:沒有預設字段,加單引号則為字元串,其他為整型,如果輸入字元串不加單引号,如:123abc,則資料庫會報錯;
2.删除表
sqlite> drop table usr;


3.增:
sqlite> insert into usr(id, name, age, salary) values(2, 'liu', 20, 6000);
4.删
sqlite> delete from usr where id = 2;
5.改:
sqlite> update usr set gender = 'man' where id = 3;
6.查:
(1):查找表中所有内容
	sqlite> select * from usr ;


(2):按指定條件查找表中内容
	1)在表中查找id=2項的所有資訊
	  sqlite> select * from usr where id = 2;
	2)在表中超找id 大于3,小于10的項的所有資訊
	  sqlite> select * from usr where id>=2 and id<=10;
	3)在表中查找id等于3的選項,并顯示其中的name 和age
	  sqlite> select name,age from usr id=3;
	4)顯示表中的前兩項資訊
	  sqlite> select * from usr limit 2;
	5)以年齡排序顯示表中資訊
	  sqlite> select * from usr order by age ;
7.添加字段
	alter table usr add column addr;
注意:添加字段隻能為字元串格式
8.更新表中的記錄
	  sqlite> update usr name='farsight' where id=88 and age=23;
9.更改表中的字段名
	  sqlite3> alter table usr rename column oldColumnName to newColumnName;
備注:
	1)alter table usr rename to temp;
	2)create table usr(id,name,height);
	3)insert into usr select id,name,age from temp;


************************************************************
------------------程式設計接口--------------------------
網址:www.sqlite.org
1.打開資料庫:
	int sqlite3_open(char *path, sqlite3 **db);
	db:指向sqlite句柄的指針;
	成功傳回0;
	失敗傳回錯誤碼;
2.出錯判斷
	char *sqlite3_errmsg(sqlite3*);
///


3.執行sql操作
(1)int sqlite3_exec(
  sqlite3*,                                  /* 資料庫句柄 */
  const char *sql,                           /* SQL語句 */
  int (*callback)(void*,int,char**,char**),  /* 執行函數 */
  void *,                                    /* 函數參數 */
  char **errmsg                              /* 錯誤資訊指針的位址 */
);


///
執行函數:每找到一條自動執行一次函數
typedef int (*sqlite3_callback)(
			void *para, 	//傳遞給函數的參數
			int f_num, 		//記錄中包含的字段的數目
			char **f_value, //包含每個字段值的指針數組
			char **f_name	//包含每個字段名稱的指針數組
			);


//

sqlite3_exec  測試代碼:

#include <stdio.h>
#include <stdlib.h>
#include <sqlite3.h>
#include <string.h>

//查詢到一條記錄就會調用一次回調函數
/***********************************
 *addr : 給回調函數傳遞的參數
 *n_column : 記錄的條數
 *value  : 儲存查到的結果[指針數組]
 *name   : 儲存字段名[指針數組]
 **********************************/
int printf_info(void *addr,int n_column,char **value,char **name)
{
	int i = 0;


	//列印字段名
	for(i = 0;i < n_column;i ++)
		printf("%s\t",name[i]);
	printf("\n");


	//列印字段值 
	for(i = 0;i < n_column;i ++)
		printf("%s\t",value[i]);
	printf("\n");


	return 0;
}


int exec_sql(sqlite3 *pdb,char *sql)
{
	int ret;
	char *errmsg;
	
	ret = sqlite3_exec(pdb,sql,printf_info,NULL,&errmsg);
	if(ret != SQLITE_OK){
		printf("Error : %s.\n",errmsg);
		return -1;
	}


	return 0;
}


//./a.out test.db
int main(int argc, const char *argv[])
{
	int ret;
	sqlite3 *pdb;
	char buf[1024];


	if(argc < 2)
	{
		fprintf(stderr,"Usage : %s argv[1].\n",argv[0]);
		exit(EXIT_FAILURE);
	}
	
	//打開資料庫檔案
	ret = sqlite3_open(argv[1],&pdb);
	if(ret != SQLITE_OK){
		printf("sqlite3_open  %s : %s.\n",argv[1],sqlite3_errmsg(pdb));
		exit(EXIT_FAILURE);
	}


	while(1)
	{
		printf("sqlite3>");
		fgets(buf,sizeof(buf),stdin);
		buf[strlen(buf) - 1] = '\0';
		
		if(strncmp(buf,"quit",4) == 0)
			break;


		exec_sql(pdb,buf);
	}


	sqlite3_close(pdb);


	return 0;
}


(2)int   sqlite3_get_table(sqlite3 *db, const  char  *sql,  char ***resultp,  int*nrow,  int *ncolumn, char **errmsg);
功能:執行SQL操作
      db:資料庫句柄
      sql:SQL語句
      resultp:用來指向sql執行結果的指針
      nrow:滿足條件的記錄的數目
      ncolumn:每條記錄包含的字段數目
      errmsg:錯誤資訊指針的位址
傳回值:成功傳回0,失敗傳回錯誤碼
sqlite3_get_table測試代碼:
#include <sqlite3.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>


int do_select(sqlite3 *pdb,char *sql)
{
	int i = 0,j = 0;
	char *errmsg;
	char **result;
	int n_row = 0;
	int n_coloumn = 0;
	int ret;
	int Index;


	ret = sqlite3_get_table(pdb,sql,&result,&n_row,&n_coloumn,&errmsg);
	if(ret != SQLITE_OK){
		fprintf(stderr,"Exec %s:%s.\n",sql,errmsg);
		return -1;
	}
	
	Index = n_coloumn;


	//查到記錄
	if(n_row != 0){
		//輸出字段名
		for(i = 0;i < n_coloumn;i ++)
		{
			printf("%s\t",result[i]);
		}


		printf("\n");


		//輸出字段值
		for(i = 0;i < n_row;i ++)
		{
			for(j = 0;j < n_coloumn;j ++)
			{
				printf("%s\t",result[Index]);
				Index ++;
			}
			printf("\n");
		}
	
	}else{
		printf("No result!.\n");
	}


	//釋放存放記錄的空間
	sqlite3_free_table(result);


	return 0;
}


//./a.out database
int main(int argc, const char *argv[])
{
	char buf[1024];
	int ret;
	sqlite3 *pdb;
	
	ret = sqlite3_open(argv[1],&pdb);
	if(ret != SQLITE_OK){
		fprintf(stderr,"sqlite3 open %s : %s.\n",argv[1],sqlite3_errmsg(pdb));
		exit(EXIT_FAILURE);
	}
	
	while(1)
	{
		fgets(buf,sizeof(buf),stdin);
		buf[strlen(buf) - 1] = '\0';


		do_select(pdb,buf);
	}
	
	exit(EXIT_SUCCESS);
}
注意:考慮到sqlite3_exec 需要使用回調函數,在程式設計時是通常使用sqlite3_gettable(),用來執行列印操作,而使用sqlite3_exec()來執行其它的sql語句;