sqlite3数据库API-执行sql语句(三)
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语句(三)相关推荐
- 帝国cms php sql,帝国CMS下在PHP文件中调用数据库类执行SQL语句实例
帝国CMS下在PHP文件中调用数据库类执行SQL语句实例 例1:连接MYSQL数据库例子.(a.php) db_close(); //关闭MYSQL链接$empire=null; //注消操作类变量? ...
- java数据库编程——执行SQL 语句
[0]README 1) 本文文字描述+source code 均转自 core java volume 2 , 旨在理解 java数据库编程--执行SQL 语句 的基础知识 : 2)for sour ...
- 云服务器怎么执行sql文件在哪里,总结帝国CMS下在PHP文件中怎么调用数据库类执行SQL语句实例...
总结帝国CMS下在PHP文件中怎么调用数据库类执行SQL语句实例 发布时间:2020-10-19 14:58:08 来源:亿速云 阅读:83 作者:小新 这篇文章将为大家详细讲解有关总结帝国CMS下在 ...
- Java让数据库执行一条sql_java数据库编程——执行SQL 语句
[0]README [1]java数据库编程--执行SQL 语句相关 1)执行 SQL 命令前, 首先需要创建一个 Statement 对象: 要创建 statement 对象,不需要调用 Drive ...
- 【Python】Pandas在数据库中执行SQL语句并加载结果
提示 建议采用 try-except-finally- 或者 try-finally- ,保证与数据库的连接被关闭. SQL语句入门很简单 (精深很难) ,不会的自己去简单学学. 建库建表 注意con ...
- Python 技术篇-连接oracle数据库并执行sql语句实例演示,python连接oracle数据库oci详细配置方法
Python 连接 Oracle 数据库 第一章:连接 oracle 数据与环境配置 ① 连接 oracle 数据库效果演示 ② oci 下载 ③ oci 配置 ④ 环境变量配置 ⑤ 检测是否有 or ...
- 帝国cms与mysql数据库_帝国CMS下在PHP文件中调用数据库类执行SQL语句实例
例1:连接MYSQL数据库例子.(a.php) require('e/class/connect.php'); //引入数据库配置文件和公共函数文件 require('e/class/db_sql.p ...
- IDEA连接MySQL数据库并执行SQL语句使用数据
文章目录 一.IDEA连接MySQL数据库 (一)首先新建普通Java项目 (二)连接数据库 1.点击右侧DataBase 2.点击加号,找到MySQL,添加数据库 3.输入用户名和密码,点击**Te ...
- Winform中使用Mysql.Data.dll实现连接Mysql数据库并执行sql语句(排除ddl等非法语句的执行)
场景 Winform中连接Mysql8并查询表中数据进行显示: Winform中连接Mysql8并查询表中数据进行显示_BADAO_LIUMANG_QIZHI的博客-CSDN博客 与上面实现的流程类似 ...
最新文章
- 对抗学习用于目标检测--A-Fast-RCNN: Hard Positive Generation via Adversary for Object Detection
- 16.oauth2 + oidc 实现 client部分
- 去除Office 2010的右键“共享文件夹同步”菜单
- Linux快速查看某条命令的版本和存放的位置(ls -l `which mvn`)
- C++操作SQLite数据库
- underscore 系列之防冲突与 Utility Functions
- firefox+android+平板,Firefox模拟手机浏览器(iOS+Android) – UserAgent Switcher使用方法...
- LAMP 3.4 mysql常用操作-2
- 阿里云函数计算应用:将ActionTrail审计事件从OSS导入到SLS中
- 100个java编程实例_100个java编程实例
- 带外壳版本4G LTE模块,包括华为ME909系列、移远EC20系列、移远EC200T系列
- 【转】Simulink中matlab Function模块全局变量的使用方法总结
- 墨卡托经纬度坐标转换
- DeepCross(DCN)模型及torch实现
- java人民币金额大写_[求助]用java实现整数转换为人民币金额大写的功能
- 下行L1/L2控制信道
- 1.17英文题面翻译
- 搭档之家:牛市来了!阿里云“临牛受命”,接到多家券商扩容需求
- Codeforces 446C. DZY Loves Fibonacci Numbers (Fibonacci + 线段树)
- 【建议珍藏】2023年最新Android大厂面经分析,最终入职得物
热门文章
- 软件测试培训班适合女生吗
- 国产公链一哥:BUMO技术领先在哪里?
- LSH系列3:p-stable LSHE2LSH——原理介绍
- 过去十年,我们用了哪些即时战略游戏训练AI?
- linux红旗内核升级,在红旗Linux 11中用Ubuntu的kernel-ppa包升级内核
- AI香水来了,你会买吗?
- 懒人开关 ESP32控制舵机旋转(基于ESP32+SG90舵机+微信小程序)
- android手势第一次设置密码_[Android开发实战]Android手势密码(支付宝手势密码)实现(支持2.x) | 学步园...
- java multiply_Java.math.BigInteger.multiply()方法实例
- html5 video 文本轨道,VideoJS-轨道-文本轨道