指针扰幽梦 发表于 2012-10-27 11:12

sqlite非回调查询简单分析

这几天在做一个简单的嵌入式web页面,用的CGI,boa服务器,在注册用户非回调查询数据库sqlite3_get_table这个函数使用上遇到了难题。还好昨晚仔细磨了一下,感觉有了点理解。
函数原型:
int sqlite3_get_table(sqlite3*, const char *sql, char ***result, int *row, int *colum, char **errmsg);
参数分析:
      sqlite3 * 为已打开的数据库句柄;
      sql 要执行的SQL语句
         result 用来存放查询结果记录
      row 该函数返回的记录数,即有多少条数据
         colum 函数返回的字段数
         errmsg 出错信息

那么到底如何使用这个函数取出数据呢,这些数据怎样存放的。
加入我创建了一个表:userinfo
               0               1            2
               ----------------------------
            0username   password   tel
               ----------------------------
               1   小小      123456      xxx
                     ----------------------------
               2   歪歪      456789      xxx
                     -----------------------------
以此表为例
             加入上面的SQL语句为select name from userinfo 那么此时row=3,colum=1,
         (假如是select * from userinfo 那么row=3,colom=3)
             存放在result里的数据会是:
             “username”
             “小小”
             “歪歪”
             即result-->“username”
                        “小小”
                        “歪歪”
            此时printf("%s",result) 应为username   
            printf("%s",result) 应为小小
            printf("%s",result) 为歪歪

假如我们要获取表中第1行第2列的数据,可以试着推算这个位置:第1行第2列对应的是第5格,那么应该是1*3+2,
依次类推如果是第2行第2列,那么就是第8格,即2*3+2.   由此可得通用表达式应为 i*colum+j

因此,可以用for(i=1;i<row;i++)
               {
                     for(j=0;j<colum;j++)
                           printf("%s\n",result);
            }
获知表单中的所有内容,注意i是从1开始的,因为0行是存放字段名称的,我们要取的是对应字段的值。
            
下面是我写的一段验证注册代码

                     char **result;
50               int row = 0,colum = 0;
51               int i=0,j=0;
52               ret = sqlite3_get_table(db,sql,&result,&row,&colum,&err_msg);
53               if(ret != SQLITE_OK)
54               {
55 //                      printf("select falid\n");
56                         sqlite3_close(db);
57               }
58               else
59               {
60               //      printf("there is %d data row\n",row);
61               //      printf("there is %d data colum\n",colum);
62
63                         for(i=1;i<row;i++)
64                         {
65                                 for(j=0;j<colum;j++)
66                                 {
67                                       //printf("%s\n",result);
68                                       if(strcmp(name,result) !=0 )
69                                       {
70                                                 sprintf(sql,"insert into userinfo(username,password,tel) values('%s','%s','%s');",name,password,tel);
71                                                 ret = sqlite3_exec(db,sql,0,0,&err_msg);
72                                                 if(ret != SQLITE_OK)
                                             if(ret != SQLITE_OK)
73                                                 {
74                                                         sqlite3_close(db);
75                                                 }
76                                                 else
77                                                 {
78                                                         cgiHeaderContentType("text/html;>");
79                                                         fprintf(cgiOut, "<HTML><HEAD>\n");
80                                                         fprintf(cgiOut, "<META HTTP-EQUIV=\"Content-type\" CONTENT=\"text/html; charset=utf-8\"\n");
81                                                         fprintf(cgiOut, "<TITLE>注册验证</TITLE></HEAD>\n");
82                                                         fprintf(cgiOut, "<BODY>");
83                                                         fprintf(cgiOut, "<P>用户:%s注册成功--- 电话号码:%s<P>",name,tel);
84                                                         fprintf(cgiOut, "<meta http-equiv=\"refresh\" content=\"2;url=../main.html\">");
85                                                 }
86                                       }
87                                       else
88                                       {
89                                                 cgiHeaderContentType("text/html;>");
90                                                 fprintf(cgiOut, "<HTML><HEAD>\n");
91                                                 fprintf(cgiOut, "<META HTTP-EQUIV=\"Content-type\" CONTENT=\"text/html; charset=utf-8\"\n");
92                                                 fprintf(cgiOut, "<TITLE></TITLE></HEAD>\n");
93                                                 fprintf(cgiOut, "<BODY>");
94                                                 fprintf(cgiOut, "<P>用户:%s 已经存在,请重新注册<P>",name);
95                                                 fprintf(cgiOut, "<meta http-equiv=\"refresh\" content=\"2;url=../regist.html\">");
                                                      return 0;
98                                       }
99                                 }//end of for 2
100
101                         }//end offor 1
                  }//end of else 1

       由于自己也是刚刚接触sqilte,所以就写下了自己的这些分析过程,其中肯定有自己理解错误,或者不到位的地方,希望大家指正,一起进步~~~~~~~~~~~~~
页: [1]
查看完整版本: sqlite非回调查询简单分析