sqlite3入门之sqlite3_mprintf
sqlite3_mprintf
- sqlite3_mprintf()函数原型:
char *sqlite3_mprintf(const char*,...);
- sqlite3_mprintf()的作用是将结果写入到sqlite3_malloc()获取的内存中,例程返回的字符串应该使用sqlite3_free()进行释放,如果无法申请到足够的内存,则会返回NULL指针;
- 它同c库函数 sprintf()类似,实现一些额外的格式化。对所有常用的printf()格式化选项都适用。另外还有非常用选项:%q, %Q, %z;
- %q选项的作用类似于%s,它会替换了参数列表中以空字符结尾的字符串%q,同时他会将单引号字符转义,有助于防止SQL注入攻击;
- 示例:
char * zText =“这是快乐的一天!”;
char * zSQL = sqlite3_mprintf(“INSERT INTO table VALUES('%q')”,zText);
sqlite3_exec(db,zSQL,,,);
sqlite3_free(ZSQL)- 因为使用了%q格式字符串,所以zText中的'\''字符被转义,生成的SQL如下所示:
INSERT INTO table1 VALUES('这是快乐的一天!')
- 作为一般规则,在将文本插入字符串文字时,应始终使用%q而不是%s。
- %Q选项的作用类似于%q,除了它还在整个字符串的外部添加单引号。此外,如果参数列表中的参数是NULL指针,则%Q替换文本“NULL”(不带单引号);
char * zSQL = sqlite3_mprintf(“INSERT INTO table VALUES(%Q)”,zText);
sqlite3_exec(db,zSQL,,,);
sqlite3_free(ZSQL);- 即使zText变量是NULL指针,上面的代码也会在zSQL变量中呈现正确的SQL语句。
- “%z”格式化选项的作用类似于“%s”,但添加了在读取字符串并将其复制到结果中之后,在输入字符串上调用sqlite3_free()。
从程序看 %s, %q, %Q之间的区别
char *str_he = "合";
char *str_fen = "分"; //初始化表
for(rc = ; rc < ; rc++) {
sql = sqlite3_mprintf("INSERT INTO RELAY VALUES ('%d', '%s','%s', '2019-7-12');", rc, str_he, str_fen);
sqlite3_exec(db, sql, , , &zErrMsg);
} rc = sqlite3_get_table(db, "SELECT * FROM RELAY", &dbresult, &nRow, &nColum, &zErrMsg);
if(rc == SQLITE_OK) {
index = nColum;
for(i = ; i < nRow; i++) {
for(j = ; j < nColum; j++) {
printf("%d--%s : %s\n", i, dbresult[j], dbresult[index++]);
// ++index;
}
printf("----------------------------------------------\n");
}
}
- 输出结果:
--ID :
--C_STATUS : 合
--W_STATUS : 分
--TIME : --
----------------------------------------------
--ID :
--C_STATUS : 合
--W_STATUS : 分
--TIME : --
----------------------------------------------
--ID :
--C_STATUS : 合
--W_STATUS : 分
--TIME : --
----------------------------------------------
。。。。。
- 将 %s 改为 %q ,输出结果:
--ID :
--C_STATUS : 合
--W_STATUS : 分
--TIME : --
----------------------------------------------
--ID :
--C_STATUS : 合
--W_STATUS : 分
--TIME : --
----------------------------------------------
--ID :
--C_STATUS : 合
--W_STATUS : 分
--TIME : --
----------------------------------------------
。。。。。。
- 将 %s 改为 %Q,输出结果:
--ID :
--C_STATUS : 合
--W_STATUS : 分
--TIME : --
----------------------------------------------
--ID :
--C_STATUS : 合
--W_STATUS : 分
--TIME : --
----------------------------------------------
--ID :
--C_STATUS : 合
--W_STATUS : 分
--TIME : --
----------------------------------------------
。。。。。。
- 从上面的结果来看,当插入的字符串不为空指针时,三者之间并没有多大差别。
- 将字符串设置为NULL
char *str_he = NULL;
char *str_fen = NULL;- %s 输出结果
--ID :
--C_STATUS :
--W_STATUS :
--TIME : --
----------------------------------------------
--ID :
--C_STATUS :
--W_STATUS :
--TIME : --
----------------------------------------------
--ID :
--C_STATUS :
--W_STATUS :
--TIME : --
----------------------------------------------
。。。。。。- %q 输出结果
--ID :
--C_STATUS : (NULL)
--W_STATUS : (NULL)
--TIME : --
----------------------------------------------
--ID :
--C_STATUS : (NULL)
--W_STATUS : (NULL)
--TIME : --
----------------------------------------------
--ID :
--C_STATUS : (NULL)
--W_STATUS : (NULL)
--TIME : --
----------------------------------------------
。。。。。。- %Q输出结果
--ID :
--C_STATUS : (null)
--W_STATUS : (null)
--TIME : --
----------------------------------------------
--ID :
--C_STATUS : (null)
--W_STATUS : (null)
--TIME : --
----------------------------------------------
--ID :
--C_STATUS : (null)
--W_STATUS : (null)
--TIME : --
----------------------------------------------
。。。。。。- 当需要插入的字符为NULL时,%s 并没有将NULL插入到表中,但是%q, %Q能够将NULL插入到表中,只是大小写不一样;
sqlite3入门之sqlite3_mprintf的更多相关文章
- python sqlite3 入门 (视频讲座)
python sqlite3 入门 (视频讲座) an SQLite mini-series! - Simple Databases with Python 播放列表: YouTube https:/ ...
- Sqlite3入门简记
一,安装Sqlite3 1.入门时看http://www.runoob.com/sqlite/sqlite-intro.html,说的简单,但是适合入门 2.在终端输入sqlite3,没有返回信息,表 ...
- sqlite3入门之sqlite3_get_table,sqlite3_free_table
sqlite3_get_table sqlite3_get_table函数原型: int sqlite3_get_table( sqlite3 *db, /* An open database */ ...
- sqlite3 入门
SQLite3 C语言API入门下载SQLite3 我们下载sqlite源码包,只需要其中的sqlite3.c.sqlite.h即可.最简单的一个创建表操作#include <stdio.h&g ...
- sqlite3入门之sqlite3_open,sqlite3_exec,slite3_close
sqlite3_open sqlite3_open函数原型: int sqlite3_open( const char *filename, /* Database filename (UTF-8) ...
- sqlite3使用入门
sqlite的安装 1. 首先是下载sqlite,可以该页面下载:http://www.sqlite.org/download.html 当前的最新版本为:sqlite-shell-win32-x86 ...
- SQLite3简单入门及C++ API
转载请注明出处:http://www.cnblogs.com/StartoverX/p/4660487.html 项目用到SQLite3,简单记录一下. MySQL不同,SQLite3的数据库基于文件 ...
- Django入门实践(3)
Django简单应用 前面简单示例说明了views和Template的工作过程,但是Django最核心的是App,涉及到App则会和Model(数据库)打交道.下面举的例子是创建一个简单应用wiki ...
- 使用数据库sqlite3 C语言实现登陆注册的功能
//此代码为注册功能 void create_regtable() { int rc; //rc为返回值,判断函数是否执行成功 rc=0函数执行成功,rc !=0函数执行失败 sqlite3 *db; ...
随机推荐
- django-rest-framework 使用例子
Start Your API 创建项目 startproject rest_api 创建APP startapp task 配置 rest_api/settings.py INSTALLED_APPS ...
- RedisTemplate通过scan方法进行自定义操作:1、根据hashKey的名称匹配相关hash键值对
需求:有一个hash如下,现在想查询出stream前缀的键值对 操作方法如下: package com.example; import org.junit.Before; import org.jun ...
- 【VS开发】WaitForSingleObject 和 WaitForMultipleObjects函数 (让线程挂起等待事件)
WaitForSingleObject 和 WaitForMultipleObjects:1.WaitForSingleObject 等待函数可使线程自愿进入等待状态,直到一个特定的内核对象变为已通 ...
- linux 保留yum安装后的rpm包
在linux上,使用yum安装,默认安装完成之后会删除下载的rpm包:想要yum安装软件后,还保留安装包,那么需要修改/etc/yum.conf配置文件中的keepcache参数. [root@bog ...
- Nginx是什么及作用?代理和反向代理解析
一:介绍 nginx是一个高性能的HTTP和反向代理服务器,其特点是占用内存少,并发能力强. 二:名词介绍 代理服务器: 代理服务器英文全称是Proxy Server,其功能就是代理网络用户去取得网络 ...
- 【mysql】开启远程连接
设置root用户可以远程连接 use mysql; update user set host = '%' where user = 'root'; FLUSH PRIVILEGES;
- 六、spring之通过FactoryBean为ioc容器中添加组件
前面我们已经介绍了几种为容器中添加组件的方法,今天一起学习通过FactoryBean添加组件的方法. 首先我们准备一个类,也就是我们需要注册进spring的ioc容器中的类 类Color: // 不必 ...
- 客户端请求服务器端通信, Web 编程发展基础|乐字节
乐字节的小伙伴们,好久不见,甚是想念啊! 前面我发布的文章算是把Java初级基础阶段讲完了,接下来小乐将会给大家接着讲Java中级阶段——Javaweb. 首先,我们要看看Javaweb阶段主要重点掌 ...
- Apache Kafka教程
1.卡夫卡教程 今天,我们正在使用Apache Kafka Tutorial开始我们的新旅程.在这个Kafka教程中,我们将看到什么是Kafka,Apache Kafka历史以及Kafka的原因.此外 ...
- Crazy Binary String(前缀和)(2019牛客暑期多校训练营(第三场))
示例: 输入: 801001001 输出:4 6 题意:一段长度为n且只有 ‘0’ 和 ‘1’ 的字符串,求子串中 ‘0’ 和 ‘1’ 数目相等和子序列中 ‘0’ 和 ‘1’ 数目相等的最大长度. 思 ...