C语言实现sqlite3数据库查询的基本方法

来源:互联网 发布:短域名生成算法 编辑:程序博客网 时间:2024/04/30 05:42

sqlite回传函数相关 说了3种基本方法:callback,gettable和预处理stmt方法

下面给出测试代码和测试用数据库,代码如下

[cpp] view plain copy
  1. #include <stdio.h>   
  2. #include <stdlib.h>   
  3. #include <string.h>  
  4. #include "sqlite3.h"   
  5.   
  6. //  
  7. //typedef int (*sqlite3_callback)(   
  8. //    void* data,       /* Data provided in the 4th argument of sqlite3_exec() */   
  9. //    int ncols,        /* The number of columns in row */   
  10. //    char** values,    /* An array of strings representing fields in the row */   
  11. //    char** headers    /* An array of strings representing column names */   
  12. //);   
  13.   
  14. int callback(void* data, int ncols, char** values, char** headers)  
  15. {  
  16.     int i;  
  17.     int len =0;  
  18.     int ll=0;  
  19.     for(i=0; i < ncols; i++)  
  20.     {  
  21.         if(strlen(headers[i])>len)  
  22.             len = strlen(headers[i]);  
  23.     }  
  24.       
  25.     for(i=0; i < ncols; i++)   
  26.     {  
  27.         ll = len-strlen(headers[i]);  
  28.         while(ll)  
  29.         {  
  30.             fprintf(stdout," ");  
  31.             --ll;  
  32.         }  
  33.         fprintf(stdout, "%s: %s\n", headers[i], values[i]);  
  34.     }  
  35.   
  36.     fprintf(stdout, "\n");  
  37.     return 0;  
  38. }  
  39.   
  40. int search_by_callback(const char* db_name, const char* sql_cmd)   
  41. {    
  42.     int i = 0 ;    
  43.     int j = 0 ;    
  44.     int nrow = 0, ncolumn = 0;    
  45.     char **azResult; //二维数组存放结果    
  46.     sqlite3 *db=NULL;    
  47.     char *zErrMsg = 0;   
  48.     int rc;  
  49.     int len=0;  
  50.   
  51.     if(access(db_name, 0) == -1)  
  52.     {  
  53.         fprintf(stderr, "%s not found\n", db_name);    
  54.         return -1;    
  55.     }  
  56.       
  57.     rc = sqlite3_open(db_name, &db);  
  58.   
  59.     if( rc != SQLITE_OK)  
  60.     {    
  61.         fprintf(stderr, "%s open failed: %s\n", db_name,sqlite3_errmsg(db));    
  62.         sqlite3_close(db);    
  63.         return -1;    
  64.     }    
  65.   
  66.     //查询数据    
  67.     rc = sqlite3_exec( db,sql_cmd, callback, NULL, &zErrMsg );  
  68.     if( rc != SQLITE_OK)  
  69.     {    
  70.         fprintf(stderr, "%s %s: %s\n", db_name,sql_cmd, sqlite3_errmsg(db));    
  71.         if(zErrMsg)  
  72.         {  
  73.             fprintf(stderr,"ErrMsg = %s \n", zErrMsg);   
  74.             sqlite3_free(zErrMsg);  
  75.         }  
  76.         sqlite3_close(db);    
  77.         return -1;    
  78.     }  
  79.       
  80.     if(zErrMsg)  
  81.     {  
  82.         sqlite3_free(zErrMsg);  
  83.     }  
  84.   
  85.     //关闭数据库    
  86.     sqlite3_close(db);   
  87.     return 0;    
  88.   
  89. }  
  90.   
  91. int search_by_table(const char* db_name, const char* sql_cmd)   
  92. {    
  93.     int i = 0 ;    
  94.     int j = 0 ;    
  95.     int nrow = 0, ncolumn = 0;    
  96.     char **azResult; //二维数组存放结果    
  97.     sqlite3 *db=NULL;    
  98.     char *zErrMsg = 0;   
  99.     int rc;  
  100.     int len=0;  
  101.   
  102.     if(access(db_name, 0) == -1)  
  103.     {  
  104.         fprintf(stderr, "%s not found\n", db_name);    
  105.         return -1;    
  106.     }  
  107.       
  108.     rc = sqlite3_open(db_name, &db);  
  109.   
  110.     if( rc != SQLITE_OK)  
  111.     {    
  112.         fprintf(stderr, "%s open failed: %s\n", db_name,sqlite3_errmsg(db));    
  113.         sqlite3_close(db);    
  114.         return -1;    
  115.     }    
  116.   
  117.     //查询数据    
  118.     rc = sqlite3_get_table( db , sql_cmd, &azResult , &nrow , &ncolumn , &zErrMsg );    
  119.     if( rc != SQLITE_OK)  
  120.     {    
  121.         fprintf(stderr, "%s %s: %s\n", db_name,sql_cmd, sqlite3_errmsg(db));    
  122.         if(zErrMsg)  
  123.             fprintf(stderr,"ErrMsg = %s \n", zErrMsg);   
  124.         sqlite3_free_table( azResult );   
  125.         sqlite3_close(db);    
  126.         return -1;    
  127.     }    
  128.   
  129.     for(j=0; j < ncolumn; j++)  
  130.     {  
  131.         if(strlen(azResult[j])>len)  
  132.             len = strlen(azResult[j]);  
  133.     }  
  134.   
  135.     //从第0索引到第 nColumn - 1索引都是字段名称  
  136.     //从第 nColumn 索引开始,后面都是字段值  
  137.     for( i = 0 ; i < nrow; i++ )  
  138.     {  
  139.         for(j=0; j < ncolumn; j++)  
  140.         {  
  141.             int ll = (len- strlen(azResult[j]));  
  142.             while(ll)  
  143.             {  
  144.                 printf(" ");  
  145.                 --ll;  
  146.             }  
  147.             printf( "%s: %s\n", azResult[j], azResult[(i+1)*ncolumn+j]);  
  148.         }  
  149.         printf("\n");  
  150.     }  
  151.   
  152. #if 0     
  153.     for( j = 0 ; j < ncolumn; j++ )  
  154.     {  
  155.         printf( "%s ", azResult[j]);  
  156.     }  
  157.     printf( "\n");    
  158.   
  159.     for( i=ncolumn ; i<( nrow + 1 ) * ncolumn ; i++ )  
  160.     {  
  161.         if(((i-ncolumn+1)%ncolumn) ==0)  
  162.             printf( "%s\n",azResult[i]);  
  163.         else  
  164.             printf( "%s ",azResult[i] );   
  165.     }  
  166. #endif  
  167.     //与sqlite3_get_table对应,释放掉  azResult 的内存空间    
  168.     sqlite3_free_table( azResult );   
  169.     //关闭数据库    
  170.     sqlite3_close(db);   
  171.     return 0;    
  172.   
  173. }   
  174.   
  175. int search_by_stmt(const char* db_name, const char* sql_cmd)   
  176. {    
  177.     sqlite3 *db=NULL;    
  178.     sqlite3_stmt* stmt = 0;  
  179.     int ncolumn = 0;  
  180.     const char *column_name;  
  181.     int vtype , i;  
  182.     int rc;  
  183.   
  184.     if(access(db_name, 0) == -1)  
  185.     {  
  186.         fprintf(stderr, "%s not found\n", db_name);    
  187.         return -1;    
  188.     }  
  189.       
  190.     rc = sqlite3_open(db_name, &db);  
  191.   
  192.     if( rc != SQLITE_OK)  
  193.     {    
  194.         fprintf(stderr, "%s open failed: %s\n", db_name,sqlite3_errmsg(db));    
  195.         sqlite3_close(db);    
  196.         return -1;    
  197.     }    
  198.   
  199.     //查询数据    
  200.     rc = sqlite3_prepare_v2(db, sql_cmd, -1, &stmt, 0);  
  201.     if (rc != SQLITE_OK)  
  202.     {  
  203.         fprintf(stderr, "%s %s: %s\n", db_name,sql_cmd, sqlite3_errmsg(db));    
  204.         sqlite3_close(db);    
  205.         return -1;    
  206.     }  
  207.   
  208.     ncolumn = sqlite3_column_count(stmt);  
  209.   
  210.     while (sqlite3_step(stmt) == SQLITE_ROW)  
  211.     {     
  212.         for(i = 0 ; i < ncolumn ; i++ )  
  213.         {  
  214.             vtype = sqlite3_column_type(stmt , i);  
  215.             column_name = sqlite3_column_name(stmt , i);  
  216.             switch( vtype )  
  217.             {  
  218.               case SQLITE_NULL:  
  219.                   fprintf(stdout, "%s: null\n", column_name);     
  220.                 break;  
  221.               case SQLITE_INTEGER:  
  222.                   fprintf(stdout, "%s: %d\n", column_name,sqlite3_column_int(stmt,i));    
  223.                 break;  
  224.               case SQLITE_FLOAT:  
  225.                   fprintf(stdout, "%s: %f\n", column_name,sqlite3_column_double(stmt,i));     
  226.                 break;  
  227.               case SQLITE_BLOB: /* arguably fall through... */  
  228.                   fprintf(stdout, "%s: BLOB\n", column_name);     
  229.                 break;  
  230.               case SQLITE_TEXT:   
  231.                   fprintf(stdout, "%s: %s\n", column_name,sqlite3_column_text(stmt,i));   
  232.                 break;  
  233.               default:  
  234.                   fprintf(stdout, "%s: ERROR [%s]\n", column_name, sqlite3_errmsg(db));   
  235.                 break;  
  236.             }  
  237.         }  
  238.     }  
  239.   
  240.     sqlite3_finalize(stmt);  
  241.   
  242.     //关闭数据库    
  243.     sqlite3_close(db);   
  244.     return 0;    
  245.   
  246. }  
  247.   
  248.   
  249.   
  250. int main(int argc, char* argv[])  
  251. {  
  252.     int i=0;  
  253.     if(argc != 4)  
  254.     {  
  255.         fprintf(stderr, "usage: %s [table/callback/stmt] <db_name> <sql_cmd>\r\n", argv[0]);  
  256.         return -1;  
  257.     }  
  258.   
  259.     if((strcmp(argv[1],"table") ==0))  
  260.         search_by_table(argv[2],argv[3]);  
  261.     else if((strcmp(argv[1],"callback") ==0))  
  262.         search_by_callback(argv[2],argv[3]);  
  263.     else  
  264.         search_by_stmt(argv[2],argv[3]);  
  265.     return 0;  
  266. }  

编译 gcc sqlite3_search.c   sqlite3.c -o sqlite3_search -lpthread -ldl

阅读全文
0 0
原创粉丝点击