1.  sqlite3_get_table() - 非回调执行sql语句


SQLITE_API int sqlite3_get_table(sqlite3 *db,          /* An open database 已经打开的数据库句柄*/const char *zSql,     /* SQL to be evaluated sql语句*/char ***pazResult,    /* Results of the query 查询结果*/int *pnRow,           /* Number of result rows written here 查询结果的行数*/int *pnColumn,        /* Number of result columns written here 查询结果的列数*/char **pzErrmsg       /* Error msg written here 发生错误时错误信息*/
);

查询结果表pazResult是指向以'\0'结尾的UTF-8字符串的指针数组;假设N为行数,M为列数;阵列中有(N+1)*M个元素;

举例: 假设表内容为

Name        | Age
-----------------------
Alice       | 43
Bob         | 28
Cindy       | 21

则该表有2列(M==2); 3行(N==3); 总共有(3+1)*2=8个条目;

则pazResult指向数据的内容为:

azResult[0] = "Name";
azResult[1] = "Age";
azResult[2] = "Alice";
azResult[3] = "43";
azResult[4] = "Bob";
azResult[5] = "28";
azResult[6] = "Cindy";
azResult[7] = "21";

前M个指针指向以'\0'结尾的字符串,内容为列的名称; 其余条目都指向查询结果;

结果表可能包含一个或多个内存分配,将结果表直接传递给sqlite3_free()是不安全的,应该使用sqlite3_free_table()正确且安全的释放;

2. sqlite3_free_table()

作用: 释放结果表指针;

SQLITE_API void sqlite3_free_table(char **result);

sqlite3_get_table()接口又调用了sqlite3_exec(); sqlite3_get_table()不会访问SQLite的任何内部数据结构;它只使用此处定义的公共接口;

3.  sqlite3_exec() - 回调执行sql语句

typedef int (*sqlite3_callback)(void*,int,char**, char**);SQLITE_API int sqlite3_exec(sqlite3*,                                  /* An open database 打开的数据库句柄*/const char *sql,                           /* SQL to be evaluated sql语句*/int (*callback)(void*,int,char**,char**),  /* Callback function 回调函数 */void *,                                    /* 1st argument to callback 传递给回调函数参数*/char **errmsg                              /* Error msg written here 发生错误时存储错误信息*/
);

若sql语句为NULL或只包含空格和sql注释的指针,那么不会计算任何sql语句,也不会更改数据库;

若回调为NULL,则不会调用任何回调,并忽略结果行;

回调函数的参数:

参数1: sqlite3_exec传递的参数;

参数2: 结果中的列数;

参数3: 指向字符串的指针数组;就像sqlite3_column_text()中获取的一样,每列一个;(等同于行数组);

参数4: 指向字符串的指针数组,其中每个条目从sqlite3_column_name()获得的相应结果列的名称;(等同于列的名称)

5. 示例

#include <sqlite3.h>
#include <stdio.h>//typedef int (*sqlite3_callback)(void*,int,char**, char**);static int sql_callback(void *args, int nCol, char **rowArr, char **colName)
{printf("nCol = %d\n",nCol);for(int i = 0 ;i < nCol; i++){printf("%s = %s\n", colName[i], rowArr[i] ? rowArr[i] : "NULL");}printf("\n");return 0;
}int main(int argc, const char *argv[])
{int ret;sqlite3 *ppDb = NULL;//不存在创建并打开;ret = sqlite3_open("./config.db", &ppDb);if(ret != SQLITE_OK){printf("open config.db failed %s\n",sqlite3_errmsg(ppDb));return -1;}printf("open config.db ok\n");/* crate sql table */char *sql = NULL;sql = "CREATE TABLE COMPANY(" \"ID    INT     PRIMARY KEY NOT NULL," \"NAME TEXT    NOT NULL," \"AGE  INT     NOT NULL," \"ADDRESS      CHAR(50)," \"SALARY       REAL);" ;char *errMsg = NULL;ret = sqlite3_exec(ppDb,sql, NULL ,NULL, &errMsg);if(ret != SQLITE_OK){printf("sqlite3_exec create err %s\n",errMsg);sqlite3_free(errMsg);}printf("crate config.db table ok\n");/* insert sql */sql = "INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY)" \"VALUES (1, 'bkWu', 26, 'KaiYang', 12000.0);" \"INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY)" \"VALUES (2, 'xlLiu', 27, 'GaoYun', 5000); "\"INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY)" \"VALUES (3,'xWang', 32, 'GuiYang', '14000');"\"INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY)" \"VALUES (4, 'rgCheng',24,'QiangNan',6000);"\"INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY)" \"VALUES (5, 'jjXian',24,'',6000);";ret = sqlite3_exec(ppDb,sql, NULL ,NULL, &errMsg);if(ret != SQLITE_OK){printf("sqlite3_exec insert err %s\n",errMsg);sqlite3_free(errMsg);}printf("insert config.db table ok\n");/* select sql */sql = "SELECT * from COMPANY";#if 0 //法1ret = sqlite3_exec(ppDb,sql, sql_callback ,NULL, &errMsg); if(ret != SQLITE_OK){printf("sqlite3_exec select err %s\n",errMsg);sqlite3_free(errMsg);}/*open config.db okcrate config.db table okinsert config.db table oknCol = 5ID = 1NAME = bkWuAGE = 26ADDRESS = KaiYangSALARY = 12000.0nCol = 5ID = 2NAME = xlLiuAGE = 27ADDRESS = GaoYunSALARY = 5000.0nCol = 5ID = 3NAME = xWangAGE = 32ADDRESS = GuiYangSALARY = 14000.0nCol = 5ID = 4NAME = rgChengAGE = 24ADDRESS = QiangNanSALARY = 6000.0nCol = 5ID = 5NAME = jjXianAGE = 24ADDRESS = SALARY = 6000.0*/#else //法2int nRow, nCol;char **pazResult = NULL;ret = sqlite3_get_table(ppDb, sql, &pazResult, &nRow, &nCol, &errMsg);if(ret != SQLITE_OK){printf("sqlite3_get_table err %s\n",errMsg);sqlite3_free(errMsg);return -1;}printf("nRow = %d , nCol = %d\n", nRow, nCol);for(int i = 0; i < nCol*(nRow+1); i++){printf("pazResult[%d] = %s\n",i,pazResult[i]);}/*open config.db okcrate config.db table okinsert config.db table oknRow = 5 , nCol = 5pazResult[0] = IDpazResult[1] = NAMEpazResult[2] = AGEpazResult[3] = ADDRESSpazResult[4] = SALARYpazResult[5] = 1pazResult[6] = bkWupazResult[7] = 26pazResult[8] = KaiYangpazResult[9] = 12000.0pazResult[10] = 2pazResult[11] = xlLiupazResult[12] = 27pazResult[13] = GaoYunpazResult[14] = 5000.0pazResult[15] = 3pazResult[16] = xWangpazResult[17] = 32pazResult[18] = GuiYangpazResult[19] = 14000.0pazResult[20] = 4pazResult[21] = rgChengpazResult[22] = 24pazResult[23] = QiangNanpazResult[24] = 6000.0pazResult[25] = 5pazResult[26] = jjXianpazResult[27] = 24pazResult[28] = pazResult[29] = 6000.0*///正确且安全的释放内存sqlite3_free_table(pazResult);#endif /* update sql & select */sql = "UPDATE COMPANY set SALARY = 20000.0 where ID=3;" \"UPDATE COMPANY set SALARY = 15000.0 where ID=4;" \"SELECT * from COMPANY";ret = sqlite3_exec(ppDb,sql, sql_callback ,NULL, &errMsg); if(ret != SQLITE_OK){printf("sqlite3_exec select err %s\n",errMsg);sqlite3_free(errMsg);}/* delete sql */sql = "DELETE from COMPANY where ID=2;" \"DELETE from COMPANY where ID=5;" \"SELECT * from COMPANY";ret = sqlite3_exec(ppDb,sql, sql_callback ,NULL, &errMsg); if(ret != SQLITE_OK){printf("sqlite3_exec select err %s\n",errMsg);sqlite3_free(errMsg);}sqlite3_close(ppDb);return 0;
}

sqlite3数据库API-执行sql语句(三)相关推荐

  1. 帝国cms php sql,帝国CMS下在PHP文件中调用数据库类执行SQL语句实例

    帝国CMS下在PHP文件中调用数据库类执行SQL语句实例 例1:连接MYSQL数据库例子.(a.php) db_close(); //关闭MYSQL链接$empire=null; //注消操作类变量? ...

  2. java数据库编程——执行SQL 语句

    [0]README 1) 本文文字描述+source code 均转自 core java volume 2 , 旨在理解 java数据库编程--执行SQL 语句 的基础知识 : 2)for sour ...

  3. 云服务器怎么执行sql文件在哪里,总结帝国CMS下在PHP文件中怎么调用数据库类执行SQL语句实例...

    总结帝国CMS下在PHP文件中怎么调用数据库类执行SQL语句实例 发布时间:2020-10-19 14:58:08 来源:亿速云 阅读:83 作者:小新 这篇文章将为大家详细讲解有关总结帝国CMS下在 ...

  4. Java让数据库执行一条sql_java数据库编程——执行SQL 语句

    [0]README [1]java数据库编程--执行SQL 语句相关 1)执行 SQL 命令前, 首先需要创建一个 Statement 对象: 要创建 statement 对象,不需要调用 Drive ...

  5. 【Python】Pandas在数据库中执行SQL语句并加载结果

    提示 建议采用 try-except-finally- 或者 try-finally- ,保证与数据库的连接被关闭. SQL语句入门很简单 (精深很难) ,不会的自己去简单学学. 建库建表 注意con ...

  6. Python 技术篇-连接oracle数据库并执行sql语句实例演示,python连接oracle数据库oci详细配置方法

    Python 连接 Oracle 数据库 第一章:连接 oracle 数据与环境配置 ① 连接 oracle 数据库效果演示 ② oci 下载 ③ oci 配置 ④ 环境变量配置 ⑤ 检测是否有 or ...

  7. 帝国cms与mysql数据库_帝国CMS下在PHP文件中调用数据库类执行SQL语句实例

    例1:连接MYSQL数据库例子.(a.php) require('e/class/connect.php'); //引入数据库配置文件和公共函数文件 require('e/class/db_sql.p ...

  8. IDEA连接MySQL数据库并执行SQL语句使用数据

    文章目录 一.IDEA连接MySQL数据库 (一)首先新建普通Java项目 (二)连接数据库 1.点击右侧DataBase 2.点击加号,找到MySQL,添加数据库 3.输入用户名和密码,点击**Te ...

  9. Winform中使用Mysql.Data.dll实现连接Mysql数据库并执行sql语句(排除ddl等非法语句的执行)

    场景 Winform中连接Mysql8并查询表中数据进行显示: Winform中连接Mysql8并查询表中数据进行显示_BADAO_LIUMANG_QIZHI的博客-CSDN博客 与上面实现的流程类似 ...

最新文章

  1. 对抗学习用于目标检测--A-Fast-RCNN: Hard Positive Generation via Adversary for Object Detection
  2. 16.oauth2 + oidc 实现 client部分
  3. 去除Office 2010的右键“共享文件夹同步”菜单
  4. Linux快速查看某条命令的版本和存放的位置(ls -l `which mvn`)
  5. C++操作SQLite数据库
  6. underscore 系列之防冲突与 Utility Functions
  7. firefox+android+平板,Firefox模拟手机浏览器(iOS+Android) – UserAgent Switcher使用方法...
  8. LAMP 3.4 mysql常用操作-2
  9. 阿里云函数计算应用:将ActionTrail审计事件从OSS导入到SLS中
  10. 100个java编程实例_100个java编程实例
  11. 带外壳版本4G LTE模块,包括华为ME909系列、移远EC20系列、移远EC200T系列
  12. 【转】Simulink中matlab Function模块全局变量的使用方法总结
  13. 墨卡托经纬度坐标转换
  14. DeepCross(DCN)模型及torch实现
  15. java人民币金额大写_[求助]用java实现整数转换为人民币金额大写的功能
  16. 下行L1/L2控制信道
  17. 1.17英文题面翻译
  18. 搭档之家:牛市来了!阿里云“临牛受命”,接到多家券商扩容需求
  19. Codeforces 446C. DZY Loves Fibonacci Numbers (Fibonacci + 线段树)
  20. 【建议珍藏】2023年最新Android大厂面经分析,最终入职得物

热门文章

  1. 软件测试培训班适合女生吗
  2. 国产公链一哥:BUMO技术领先在哪里?
  3. LSH系列3:p-stable LSHE2LSH——原理介绍
  4. 过去十年,我们用了哪些即时战略游戏训练AI?
  5. linux红旗内核升级,在红旗Linux 11中用Ubuntu的kernel-ppa包升级内核
  6. AI香水来了,你会买吗?
  7. 懒人开关 ESP32控制舵机旋转(基于ESP32+SG90舵机+微信小程序)
  8. android手势第一次设置密码_[Android开发实战]Android手势密码(支付宝手势密码)实现(支持2.x) | 学步园...
  9. java multiply_Java.math.BigInteger.multiply()方法实例
  10. html5 video 文本轨道,VideoJS-轨道-文本轨道