• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            woaidongmao

            文章均收錄自他人博客,但不喜標(biāo)題前加-[轉(zhuǎn)貼],因其丑陋,見(jiàn)諒!~
            隨筆 - 1469, 文章 - 0, 評(píng)論 - 661, 引用 - 0
            數(shù)據(jù)加載中……

            SQLite常用函數(shù)

            Sqlite常用函數(shù):

            1、打開(kāi)數(shù)據(jù)庫(kù):
            說(shuō)明:打開(kāi)一個(gè)數(shù)據(jù)庫(kù),文件名不一定要存在,如果此文件不存在,sqlite會(huì)自動(dòng)創(chuàng)建。第一個(gè)參數(shù)指文件名,第二個(gè)參數(shù)則是定義的 sqlite3 ** 結(jié)構(gòu)體指針(關(guān)鍵數(shù)據(jù)結(jié)構(gòu)),這個(gè)結(jié)構(gòu)底層細(xì)節(jié)如何,您不用管它。
            int sqlite3_open(                                                                

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

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

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

             

            2、關(guān)閉數(shù)據(jù)庫(kù):
            說(shuō)明:如果用sqlite3_open開(kāi)啟了一個(gè)數(shù)據(jù)庫(kù),結(jié)尾時(shí)不要忘了用這個(gè)函數(shù)關(guān)閉數(shù)據(jù)庫(kù)。

            int sqlite3_close(sqlite3*);  //參數(shù)就是剛才的結(jié)構(gòu)體,也就是數(shù)據(jù)庫(kù)句柄


            3
            、執(zhí)行SQL語(yǔ)句:
            說(shuō) 明:這個(gè)函數(shù)的功能是執(zhí)行一條或者多條SQL語(yǔ)句,SQL語(yǔ)句之間用“;”號(hào)隔開(kāi)。建議在執(zhí)行一條或者多條SQL語(yǔ)句得時(shí)候,指定第三個(gè)參數(shù)回調(diào)函數(shù),在 回調(diào)函數(shù)中可以獲得執(zhí)行Sql得詳細(xì)過(guò)程,如果所有Sql執(zhí)行完畢則應(yīng)該返回0,否則,則說(shuō)明這次執(zhí)行并沒(méi)有完全成功。第五個(gè)參數(shù):如果執(zhí)行失敗(沒(méi)有返回0)則可以查看第五個(gè)闡述得值。來(lái)查看詳細(xì)錯(cuò)誤信息。
            int sqlite3_exec(
            sqlite3*, /*
            已經(jīng)打開(kāi)的數(shù)據(jù)庫(kù)句柄 */
            const char *sql, /*
            要執(zhí)行的Sql語(yǔ)句*/
            sqlite_callback, /*
            回調(diào)函數(shù)*/
            void *, /*
            傳遞給回調(diào)函數(shù)的參數(shù)*/
            char **errmsg /*
            保存錯(cuò)誤信息*/
            );
            通常sqlite3_callback和它后面的void*這兩個(gè)位置都可以填NULL,表示不需要回調(diào)。比如您做insert操作,做delete操作,就沒(méi)有必要使用回調(diào)。而當(dāng)作select時(shí),就要使用回調(diào),因?yàn)?span lang="EN-US">sqlite3
            把數(shù)據(jù)查出來(lái),得通過(guò)回調(diào)告訴你查出了什么數(shù)據(jù)。

             

            4exec的回調(diào)

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

            說(shuō)明:你的回調(diào)函數(shù)必須定義為上面這個(gè)函數(shù)的類型。
            例如:

            int LoadMyInfo( void * para, int n_column, char ** column_value, char ** column_name )
            {
                        //para
            是你在 sqlite3_exec 里傳入的 void * 參數(shù)

                        //通過(guò)para參數(shù),你可以傳入一些特殊的指針(比如類指針、結(jié)構(gòu)指針),然后在這里面強(qiáng)制轉(zhuǎn)換成對(duì)應(yīng)的類型(這里面是void*類型,必須強(qiáng)制轉(zhuǎn)換成你的類型才可用)。然后操作這些數(shù)據(jù)

                        //n_column是這一條記錄有多少個(gè)字段 (即這條記錄有多少列)

                        // char ** column_value 是個(gè)關(guān)鍵值,查出來(lái)的數(shù)據(jù)都保存在這里,它實(shí)際上是個(gè)1維數(shù)組(不要以為是2維數(shù)組),每一個(gè)元素都是一個(gè) char * 值,是一個(gè)字段內(nèi)容(用字符串來(lái)表示,以\0結(jié)尾)

                        //char ** column_name column_value是對(duì)應(yīng)的,表示這個(gè)字段的字段名稱


            5
            、取當(dāng)前插入位置:
            功能:返回你前一次插入得位置,從1開(kāi)始,sqlite3* 為你打開(kāi)數(shù)據(jù)庫(kù)所得到得句柄。
            long long int sqlite3_last_insert_rowid(sqlite3*);

            6
            、非回調(diào)select查詢:
            功能:執(zhí)行一次查詢Sql 并且返回得到一個(gè)記錄集。
            int sqlite3_get_table(
            sqlite3*, /*
            已經(jīng)打開(kāi)的數(shù)據(jù)庫(kù)句柄 */
            const char *sql, /*
            要執(zhí)行的Sql語(yǔ)句*/
            char ***resultp, /*
            保存返回記錄集的指針*/
            int *nrow, /*
            返回記錄數(shù)(及查出多少行)*/
            int *ncolumn, /*
            返回字段數(shù)(多少列)*/
            char **errmsg /*
            返回錯(cuò)誤信息*/
            )

            說(shuō)明:第三個(gè)參數(shù)是查詢結(jié)果,它是一維數(shù)組,內(nèi)存布局為:第一行是字段名稱,后面是緊接著是每個(gè)字段的值。
            實(shí)例:

            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;
                  }

            //數(shù)據(jù)庫(kù)操作代碼

            //假設(shè)前面已經(jīng)創(chuàng)建了 MyTable_1

            //開(kāi)始查詢,傳入的 dbResult 已經(jīng)是 char **,這里又加了一個(gè) & 取地址符,傳遞進(jìn)去的就成了 char ***

            result = sqlite3_get_table( db, “select * from MyTable_1”, &dbResult, &nRow, &nColumn, &errmsg );

            if( SQLITE_OK == result )
            {
                   //
            查詢成功
                  index = nColumn; //
            前面說(shuō)過(guò) dbResult 前面第一行數(shù)據(jù)是字段名稱,從 nColumn 索引開(kāi)始才是真正的數(shù)據(jù)
                   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
            的字段值是連續(xù)的,從第0索引到第 nColumn - 1索引都是字段名稱,從第 nColumn 索引開(kāi)始,后面都是字段值,它把一個(gè)二維的表(傳統(tǒng)的行列表示法)用一個(gè)扁平的形式來(lái)表示
                       }
                       printf( “-------\n” );

                   }
            }

            //到這里,不論數(shù)據(jù)庫(kù)查詢是否成功,都釋放 char** 查詢結(jié)果,使用 sqlite 提供的功能來(lái)釋放
            sqlite3_free_table( dbResult );
            //
            關(guān)閉數(shù)據(jù)庫(kù)
            sqlite3_close( db );

            return 0;
            }


            7
            、釋放查詢結(jié)果:
            功能:釋放當(dāng)前查詢的記錄集所占用的內(nèi)存
            void sqlite3_free_table(char **result);

             

            實(shí)例:(SQLite數(shù)據(jù)庫(kù)使用回調(diào)函數(shù)的簡(jiǎn)單C語(yǔ)言實(shí)例)

            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 肥仔 閱讀(2391) 評(píng)論(0)  編輯 收藏 引用 所屬分類: 數(shù)據(jù)庫(kù)

            99久久精品免费观看国产| 久久夜色精品国产噜噜亚洲a| 国产精品久久久久久久久软件 | 午夜精品久久影院蜜桃| AA级片免费看视频久久| 伊人久久精品线影院| 国产成年无码久久久久毛片| 久久久久高潮毛片免费全部播放| 无码国内精品久久人妻| 亚洲精品乱码久久久久久蜜桃图片 | 久久久久亚洲AV无码专区首JN | 99久久国产亚洲综合精品| 久久伊人亚洲AV无码网站| 久久精品国产一区二区三区| 久久91精品综合国产首页| 久久精品国产一区二区电影| 久久性精品| 综合久久精品色| 99久久99久久精品国产片果冻 | 精品久久久无码中文字幕| 精品久久久久久99人妻| 久久精品亚洲欧美日韩久久| 老司机国内精品久久久久| 久久国产高清字幕中文| 99久久综合国产精品二区| 久久久国产精品| 国产亚洲精久久久久久无码77777| 久久久久久精品久久久久| 亚洲成色www久久网站夜月| 久久亚洲精品中文字幕| 久久免费精品视频| 精品综合久久久久久88小说| 怡红院日本一道日本久久| 久久久99精品一区二区| 久久婷婷是五月综合色狠狠| 无码专区久久综合久中文字幕| 国产亚洲精品自在久久| 国产精品久久久久乳精品爆| 国产精品美女久久福利网站| 久久精品国产亚洲精品2020 | 香蕉久久夜色精品国产小说|