woaidongmao

文章均收录自他人博客,但不喜标题前加-[转贴],因其丑陋,见谅!~
随笔 - 1469, 文章 - 0, 评论 - 661, 引用 - 0
数据加载中……

SQLite常用函数

Sqlite常用函数:

1、打开数据库:
说明:打开一个数据库,文件名不一定要存在,如果此文件不存在,sqlite会自动创建。第一个参数指文件名,第二个参数则是定义的 sqlite3 ** 结构体指针(关键数据结构),这个结构底层细节如何,您不用管它。
int sqlite3_open(                                                                

  const char *filename,   /* Database filename (UTF-8) */                        

  sqlite3 **ppDb          /* OUT: SQLite db handle */                            

); 
返回值:表示操所是否正确  SQLITE_OK 操作正常)

 

2、关闭数据库:
说明:如果用sqlite3_open开启了一个数据库,结尾时不要忘了用这个函数关闭数据库。

int sqlite3_close(sqlite3*);  //参数就是刚才的结构体,也就是数据库句柄


3
、执行SQL语句:
说 明:这个函数的功能是执行一条或者多条SQL语句,SQL语句之间用“;”号隔开。建议在执行一条或者多条SQL语句得时候,指定第三个参数回调函数,在 回调函数中可以获得执行Sql得详细过程,如果所有Sql执行完毕则应该返回0,否则,则说明这次执行并没有完全成功。第五个参数:如果执行失败(没有返回0)则可以查看第五个阐述得值。来查看详细错误信息。
int sqlite3_exec(
sqlite3*, /*
已经打开的数据库句柄 */
const char *sql, /*
要执行的Sql语句*/
sqlite_callback, /*
回调函数*/
void *, /*
传递给回调函数的参数*/
char **errmsg /*
保存错误信息*/
);
通常sqlite3_callback和它后面的void*这两个位置都可以填NULL,表示不需要回调。比如您做insert操作,做delete操作,就没有必要使用回调。而当作select时,就要使用回调,因为sqlite3把数据查出来,得通过回调告诉你查出了什么数据。

 

4exec的回调

typedef int (*sqlite3_callback)(void*, int, char**, char**);

说明:你的回调函数必须定义为上面这个函数的类型。
例如:

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是对应的,表示这个字段的字段名称


5
、取当前插入位置:
功能:返回你前一次插入得位置,从1开始,sqlite3* 为你打开数据库所得到得句柄。
long long int sqlite3_last_insert_rowid(sqlite3*);

6
、非回调select查询:
功能:执行一次查询Sql 并且返回得到一个记录集。
int sqlite3_get_table(
sqlite3*, /*
已经打开的数据库句柄 */
const char *sql, /*
要执行的Sql语句*/
char ***resultp, /*
保存返回记录集的指针*/
int *nrow, /*
返回记录数(及查出多少行)*/
int *ncolumn, /*
返回字段数(多少列)*/
char **errmsg /*
返回错误信息*/
)

说明:第三个参数是查询结果,它是一维数组,内存布局为:第一行是字段名称,后面是紧接着是每个字段的值。
实例:

int main( int , char ** )
{
            sqlite3 * db;
            int result;
            char * errmsg = NULL;

         char **dbResult;

            int nRow, nColumn;

            int i , j;

            int index;

            result = sqlite3_open( “c:\\Dcg_database.db”, &db );
         if( result != SQLITE_OK )
         {
            return -1;
      }

//数据库操作代码

//假设前面已经创建了 MyTable_1

//开始查询,传入的 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;
}


7
、释放查询结果:
功能:释放当前查询的记录集所占用的内存
void sqlite3_free_table(char **result);

 

实例:(SQLite数据库使用回调函数的简单C语言实例)

1.       #include <stdio.h>

2.        

3.       #include <sqlite3.h>

4.        

5.        

6.        

7.       static int callback(void *NotUsed, int argc, char **argv, char **azColName)

8.        

9.       {

10.    

11.     int i;

12.    

13.     for(i=0; i<argc; i++)

14.    

15.     {

16.    

17.       printf("%s = %s\n", azColName[i], argv[i] ? argv[i] : "NULL");

18.    

19.     }

20.    

21.     printf("\n");

22.    

23.     return 0;

24.    

25.   }

26.    

27.    

28.    

29.   int main(int argc, char **argv)

30.    

31.   {

32.    

33.     sqlite3 *db;

34.    

35.     char *zErrMsg = 0;

36.    

37.     int rc;

38.    

39.    

40.    

41.     if( argc!=3 )

42.    

43.     {

44.    

45.       fprintf(stderr, "Usage: %s DATABASE SQL-STATEMENT\n", argv[0]);

46.    

47.       return 1;

48.    

49.     }

50.    

51.     rc = sqlite3_open(argv[1], &db);

52.    

53.     if( rc )

54.    

55.     {

56.    

57.       fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));

58.    

59.       sqlite3_close(db);

60.    

61.       return 1;

62.    

63.     }

64.    

65.     rc = sqlite3_exec(db, argv[2], callback, 0, &zErrMsg);

66.    

67.     if( rc!=SQLITE_OK )

68.    

69.     {

70.    

71.       fprintf(stderr, "SQL error: %s\n", zErrMsg);

72.    

73.       sqlite3_close(db);

74.    

75.       return 1;

76.    

77.     }

78.    

79.     sqlite3_close(db);

80.    

81.     return 0;

82.    

83.   }

 

 

posted on 2009-06-23 15:04 肥仔 阅读(2304) 评论(0)  编辑 收藏 引用 所属分类: 数据库


只有注册用户登录后才能发表评论。
【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理