zoukankan      html  css  js  c++  java
  • sqlite3_get_table()

    {

    •  sqlite3 *db;
    •  char *errmsg=NULL;    //用来存储错误信息字符串
    •  char ret=0;
    •  int my_age=0;    //类型根据要提取的数据类型而定
    •  char **dbResult
    •  int nRow=0, nColumn=0;     //nRow  查找出的总行数,nColumn 存储列
    •  ret = sqlite3_open("student.db",&db);
    •  if(1 == ret)     //数据库创建未成功
    •  {
    •   fprintf(stderr"Can't open this database: %s ", sqlite3_errmsg(db));    //用sqlite3_errmsg()得到错误字符串
    •   sqlite3_close(db);
    •   return -1;
    •  }
    •  ret=sqlite3_get_table(db"select * from age;"&dbResult&nRow&nColumn&errmsg);
    •  if(NULL!=errmsg)
    •  {
    •   sqlite3_free_table(dbResult);
    •   errmsg=NULL;
    •   return -1
    •  }
    •  my_age atoi(dbResult[nColumn]);
    •  sqlite3_free_table(dbResult);
    •  return 0;
    • }

    sqlite3 *db创建数据库类型的指针,通过sqlite3_open()函数使db指针指向该数据库。

    注意:

    1、 char **dbResult; 字符型的二重指针,将数据库里sqlite3_get_table()出来的数据以字符的方式给dbResult。

    2、select * from age;查询student数据库里的age表全部内容。

    3、my_age = atoi(dbResult[nColumn]);将查询出来给dbResult的数据(字符)通过aoti()转换成整型交给变量my_age供程序中直接应用。

    重点:(假设age表里有n个字段)

    1、通过select * from age;给dbResult的字符前n个(0,n)为字段名称(只有计算机认识),dbResult[n]以后分别代表字段的值(包括dbResult[n])。如图

               *      *      *      * .........*  (dbResult[0]~[n-1]分别代表字段名)

      dbResult[n]   [n+1]  [n+2]  [n+3].....[n+n-1] (dbResult[n]~[n+n-1]分别代表第一条记录的值)

      dbResult[2n]  [2n+1] [2n+2] [2n+3]....[2n+n-1](dbResult[2n]~[2n+n-1]分别代表第二条记录的值)

      dbResult[3n]  [3n+1] [3n+2] 32n+3]....[3n+n-1](dbResult[3n]~[3n+n-1]分别代表第三条记录的值)

    注:sqlite3_get_table()之后便将以上的n(字段数:简称列)给了nColumn这个变量,可直接应用。nRow变量代表共有多少条记录,可直接应用。

    2、通过select * from age where id=0;如果查到0条记录的话nRow等于0,查到1条记录的话nRow等于1,假设查到1条数据,举例:

               *      *      *      * .........*  (dbResult[0]~[n-1]分别代表字段名)

      dbResult[n]   [n+1]  [n+2]  [n+3].....[n+n-1] (dbResult[n]~[n+n-1]分别代表第一条记录的值)

    注:此时dbResult[]只有0~2n-1共2n个字符,此时如果对dbResult[2n]引用的话就会出错。查询两条语句的话以此类推。

               *      *      *      * .........*  (dbResult[0]~[n-1]分别代表字段名)

      dbResult[n]   [n+1]  [n+2]  [n+3].....[n+n-1] (dbResult[n]~[n+n-1]分别代表第一条记录的值)

      dbResult[2n]  [2n+1] [2n+2] [2n+3]....[2n+n-1](dbResult[2n]~[2n+n-1]分别代表第二条记录的值)

    注:此时dbResult[]只有0~3n-1可引用。

    二、

    sqlite3_get_table使用举例  

    void GetTable()
    {
    sqlite3 * db;
    int result;
    char * errmsg = NULL;
    char **dbResult; //是 char ** 类型,两个*号
    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条记录 ”, nRow );
     
    for( i = 0; i < nRow ; i )
    {
    printf( “第 %d 条记录 ”, i 1 );
    for( j = 0 ; j < nColumn; j )
    {
    printf( “字段名:%s ?> 字段值:%s ”, dbResult[j], dbResult [index] );
    index; // dbResult 的字段值是连续的,从第0索引到第 nColumn - 1索引都是字段名称,从第 nColumn 索引开始,后面都是字段值,它把一个二维的表(传统的行列表示法)用一个扁平的形式来表示
    }
    printf( “------- ” );
    }
    }
     
    //到这里,不论数据库查询是否成功,都释放 char** 查询结果,使用 sqlite 提供的功能来释放
    sqlite3_free_table( dbResult );
     
    //关闭数据库
    sqlite3_close( db );
    return 0;
    }
    }*/
  • 相关阅读:
    学习之路-前端-笔记-一、HTML笔记
    抄写例题作业1
    郭霖
    java遍历HashMap的高效方法
    Add Two Numbers II 两个数字相加之二
    基于socket的简单p2p聊天项目
    SimpleScalar Course Project
    Dijkstra Java
    PCA vs Linear Regression 可视化理解
    机器学习中的范数规则化之(一)L0、L1与L2范数
  • 原文地址:https://www.cnblogs.com/zxc2man/p/7463455.html
Copyright © 2011-2022 走看看