DLL文件和LIB文件生成(關於sqlite數據庫)

SQLite是一個開源的跨平臺的輕型數據庫,WINCE自己也有一個自帶的數據庫SQLCE ,但佔用的資源會比較大。最近項目中考慮用到 SQLite,所以特別研究了一下,下面介紹一下具體的移植方法。html

1、下載SQLite源碼sql

       去SQLite官網http://www.sqlite.org/download.htm下載最新的source code。我下載的是sqlite-amalgamation-3071401.zip。解壓後會得獲得四個文件(shell.c、sqlite3.c、sqlite3.h、sqlite3ext.h)。shell

2、編譯生成WINCE下DLL數據庫

      1. 在VS2005下新建一個Win32智能設備項目,選擇相應的SDK,並選擇應用程序類型爲DLL。windows

      2. 將sqlite-amalgamation-3071401.zip解壓後的sqlite3.c、sqlite3.h文件拷貝到工程目錄下並添加至工程目錄。以下圖所示。app

            

       3.在預處理中增長SQLITE_ENABLE_RTREE和SQLITE_ENABLE_COLUMN_METADATA宏定義。如圖所示:函數

           

        4.編譯項目,會提示「error LNK2019: 沒法解析的外部符號 localtime_s,該符號在函數 osLocaltime 中被引用」錯誤,此錯誤的解決方法是將localtime_s替換成_localtime64_s便可。工具

        5.編譯成功後會發現目錄下會生成SQLite.dll文件,但會發現沒有lib文件,這樣在使用這個DLL時是無法編譯的,因此還須要導出.lib文件,解決方法是在SQLite官網上下載sqlite-dll-win32-x86-XXXXXX.zip文件,解壓後將目錄下的sqlite3.def文件拷貝到DLL工程目錄,在項目屬性--連接器--輸入--模塊定義文件中添加sqlite3.def,以下圖所示,而後編譯便可。測試

           

這樣SQLite的編譯工做就大功告成了。spa

3、WINCE 下SQLite測試

        新建一個SQLite測試程序,測試代碼以下:       

 

[cpp] view plaincopy

  1. #include <windows.h>  
  2.   
  3. // sqlite3的回調函數  
  4. int SQLiteQueryResultCallBack( void * para, int n_column, char ** column_value, char ** column_name )  
  5.   
  6. int main(int argc,char* argv[])  
  7. {  
  8.     sqlite3 * db = NULL; //聲明sqlite關鍵結構指針  
  9.     int result;  
  10.     // 打開或建立數據庫  
  11.     result = sqlite3_open("NAND2\\sqlite.db", &db );  
  12.     if( result != SQLITE_OK )  
  13.     {  
  14.         //數據庫打開失敗  
  15.         return -1;  
  16.     }  
  17.     char * errmsg = NULL;  
  18.     // 數據庫操做代碼  
  19. #if 1  
  20.     // 建立一個測試表,表名叫 MyTable,有2個字段: ID 和 name。其中ID是一個自動增長的類型,之後insert時能夠不去指定這個字段,它會本身從0開始增長  
  21.     result = sqlite3_exec( db, "create table MyTable( ID integer primary key autoincrement, name nvarchar(32) )", NULL, NULL, &errmsg );  
  22.     if(result != SQLITE_OK )  
  23.     {  
  24.         printf("建立表失敗,錯誤碼:%d,錯誤緣由:%s\n", result, errmsg );  
  25.     }  
  26.     // 插入記錄  
  27.     result = sqlite3_exec( db, "insert into MyTable( name ) values ( '張三' )", 0, 0, &errmsg );  
  28.     if(result != SQLITE_OK )  
  29.     {  
  30.         printf("插入記錄失敗,錯誤碼:%d,錯誤緣由:%s\n", result, errmsg );  
  31.     }  
  32.     // 插入記錄  
  33.     result = sqlite3_exec( db, "insert into MyTable( name ) values ( '李四' )", 0, 0, &errmsg );  
  34.     if(result != SQLITE_OK )  
  35.     {  
  36.         printf("插入記錄失敗,錯誤碼:%d,錯誤緣由:%s\n", result, errmsg );  
  37.     }  
  38. #endif  
  39.     // 開始查詢數據庫  
  40.     result = sqlite3_exec( db, "select * from MyTable", SQLiteQueryResultCallBack, NULL, &errmsg );  
  41.     // 關閉數據庫  
  42.     sqlite3_close( db );  
  43.   
  44.     return 0;  
  45. }  
  46.   
  47. // sqlite3的回調函數  
  48. int SQLiteQueryResultCallBack( void * para, int n_column, char ** column_value, char ** column_name )  
  49. {  
  50.     printf( "******************************\n" );  
  51.     printf("記錄包含 %d 個字段\n", n_column );  
  52.     for(int i = 0 ; i < n_column; i ++ )  
  53.     {  
  54.         printf( "字段名:%s 字段值:%s\n", column_name[i], column_value[i] );  
  55.     }  
  56.     printf( "******************************\n" );  
  57.     return 0;  
  58. }  
 
  1. #include <windows.h>

  2.  
  3. // sqlite3的回調函數

  4. int SQLiteQueryResultCallBack( void * para, int n_column, char ** column_value, char ** column_name )

  5.  
  6. int main(int argc,char* argv[])

  7. {

  8. sqlite3 * db = NULL; //聲明sqlite關鍵結構指針

  9. int result;

  10. // 打開或建立數據庫

  11. result = sqlite3_open("NAND2\\sqlite.db", &db );

  12. if( result != SQLITE_OK )

  13. {

  14. //數據庫打開失敗

  15. return -1;

  16. }

  17. char * errmsg = NULL;

  18. // 數據庫操做代碼

  19. #if 1

  20. // 建立一個測試表,表名叫 MyTable,有2個字段: ID 和 name。其中ID是一個自動增長的類型,之後insert時能夠不去指定這個字段,它會本身從0開始增長

  21. result = sqlite3_exec( db, "create table MyTable( ID integer primary key autoincrement, name nvarchar(32) )", NULL, NULL, &errmsg );

  22. if(result != SQLITE_OK )

  23. {

  24. printf("建立表失敗,錯誤碼:%d,錯誤緣由:%s\n", result, errmsg );

  25. }

  26. // 插入記錄

  27. result = sqlite3_exec( db, "insert into MyTable( name ) values ( '張三' )", 0, 0, &errmsg );

  28. if(result != SQLITE_OK )

  29. {

  30. printf("插入記錄失敗,錯誤碼:%d,錯誤緣由:%s\n", result, errmsg );

  31. }

  32. // 插入記錄

  33. result = sqlite3_exec( db, "insert into MyTable( name ) values ( '李四' )", 0, 0, &errmsg );

  34. if(result != SQLITE_OK )

  35. {

  36. printf("插入記錄失敗,錯誤碼:%d,錯誤緣由:%s\n", result, errmsg );

  37. }

  38. #endif

  39. // 開始查詢數據庫

  40. result = sqlite3_exec( db, "select * from MyTable", SQLiteQueryResultCallBack, NULL, &errmsg );

  41. // 關閉數據庫

  42. sqlite3_close( db );

  43.  
  44. return 0;

  45. }

  46.  
  47. // sqlite3的回調函數

  48. int SQLiteQueryResultCallBack( void * para, int n_column, char ** column_value, char ** column_name )

  49. {

  50. printf( "******************************\n" );

  51. printf("記錄包含 %d 個字段\n", n_column );

  52. for(int i = 0 ; i < n_column; i ++ )

  53. {

  54. printf( "字段名:%s 字段值:%s\n", column_name[i], column_value[i] );

  55. }

  56. printf( "******************************\n" );

  57. return 0;

  58. }

4、SQLite可視化管理工具

 

 

 

        SQLite自己沒有可視化管理工具,只提供了一個命令行的管理工具SQLite.exe。有一個第三方的可視化管理工具Sqlite Expert,用着還能夠,下載地址: http://www.sqliteexpert.com/download.html

相關文章
相關標籤/搜索